SharedPreferences和序列化结合保存对象数据

来源:互联网 发布:c语言调试工具 编辑:程序博客网 时间:2024/05/21 07:58

前言

       最近在做用户注册的时候,遇到了需要填写很多表单数据,不可能在一页把所有的数据都展示完全,因此采用了分页的方式,由于在用户填写数据数据之后我们需要对用户填写的数据进行暂时的记录的,当用户会到此页时,还能查看和修改。刚开始解决这个问题我们一定会从数据的大小的角度来解决,于是就有以下几种方式:

                             A、运用临时静态变量static来保存到内存中

                              B、运用SharedPreferences来保存

                              C、运用SQLite数据库

          先来分析一下这个3种方式的优缺点, A、优点:用着随心所欲 缺点:当用户的手机有很多数据的时候,容易造成static丢失。

                               B、众所周知,SharedPreferences是Android平台上一个轻量级的存储类它提供了Android平台常规的Long长 整形、Int整形、String字符串型的保存方式。对于我来说,这么多表单的数据,我可不想一个set进去(我实在是太懒了),于是把他放在一旁。

    C、使用SQLite数据库,这个未免就有点拿大炮打小鸟,大材小用了,因此果断放弃。

      现在切入咱们的正题,由于表单的数据,一般都是一个实体类,可以进行序列化的,序列化本身的目的是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。说白了,最终就是转换成了二进制数据,

现在就引出我的思路,

1.类对象
2.序列化
3.得到字符串数据
4.存储(android五种存储方式)
5.按照存储方式来获取数据
6.反序列化
7.得到相应的对象

 

下面贴出代码:

Person.java 

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:14px;">package com.example.shareddatatest;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class Person implements Serializable {  
  6.     /** 
  7.      *  
  8.      */  
  9.     private static final long serialVersionUID = 1L;  
  10.     String name;  
  11.     int age;  
  12.     String address;  
  13.     String education;  
  14.     String tel;  
  15.   
  16.     public int getAge() {  
  17.         return age;  
  18.     }  
  19.   
  20.     public void setAge(int age) {  
  21.         this.age = age;  
  22.     }  
  23.   
  24.     public String getAddress() {  
  25.         return address;  
  26.     }  
  27.   
  28.     public void setAddress(String address) {  
  29.         this.address = address;  
  30.     }  
  31.   
  32.     public String getEducation() {  
  33.         return education;  
  34.     }  
  35.   
  36.     public void setEducation(String education) {  
  37.         this.education = education;  
  38.     }  
  39.   
  40.     public String getTel() {  
  41.         return tel;  
  42.     }  
  43.   
  44.     public void setTel(String tel) {  
  45.         this.tel = tel;  
  46.     }  
  47.   
  48.     public String getName() {  
  49.         return name;  
  50.     }  
  51.   
  52.     public void setName(String name) {  
  53.         this.name = name;  
  54.     }  
  55.   
  56.     public String getSex() {  
  57.         return sex;  
  58.     }  
  59.   
  60.     public void setSex(String sex) {  
  61.         this.sex = sex;  
  62.     }  
  63.   
  64.     String sex;  
  65.   
  66.     @Override  
  67.     public String toString() {  
  68.         return "Person [name=" + name + ", age=" + age + ", address=" + address  
  69.                 + ", education=" + education + ", tel=" + tel + ", sex=" + sex  
  70.                 + "]";  
  71.     }  
  72.   
  73.   
  74. }  
  75. </span>  

MainActivity.java

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.example.shareddatatest;  
  2.   
  3. import java.io.ByteArrayInputStream;  
  4. import java.io.ByteArrayOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.ObjectInputStream;  
  7. import java.io.ObjectOutputStream;  
  8. import java.util.HashMap;  
  9. import java.util.List;  
  10.   
  11. import android.app.Activity;  
  12. import android.content.SharedPreferences;  
  13. import android.content.SharedPreferences.Editor;  
  14. import android.os.Bundle;  
  15. import android.util.Log;  
  16. import android.view.Menu;  
  17. import android.view.View;  
  18.   
  19. public class MainActivity extends Activity {  
  20.     Person person = null;  
  21.     long startTime = 0l;  
  22.     long endTime = 0l;  
  23.   
  24.     @Override  
  25.     public void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.         setContentView(R.layout.main);  
  28.   
  29.         person = new Person();  
  30.         person.setName("LULU");  
  31.         person.setSex("bitch");  
  32.         person.setAddress("北京海淀");  
  33.         person.setAge(20);  
  34.         person.setTel("1231312");  
  35.         person.setEducation("小学");  
  36.     }  
  37.   
  38.     /** 
  39.      * 序列化对象 
  40.      *  
  41.      * @param person 
  42.      * @return 
  43.      * @throws IOException 
  44.      */  
  45.     private String serialize(Person person) throws IOException {  
  46.         startTime = System.currentTimeMillis();  
  47.         ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();  
  48.         ObjectOutputStream objectOutputStream = new ObjectOutputStream(  
  49.                 byteArrayOutputStream);  
  50.         objectOutputStream.writeObject(person);  
  51.         String serStr = byteArrayOutputStream.toString("ISO-8859-1");  
  52.         serStr = java.net.URLEncoder.encode(serStr, "UTF-8");  
  53.         objectOutputStream.close();  
  54.         byteArrayOutputStream.close();  
  55.         Log.d("serial""serialize str =" + serStr);  
  56.         endTime = System.currentTimeMillis();  
  57.         Log.d("serial""序列化耗时为:" + (endTime - startTime));  
  58.         return serStr;  
  59.     }  
  60.   
  61.     /** 
  62.      * 反序列化对象 
  63.      *  
  64.      * @param str 
  65.      * @return 
  66.      * @throws IOException 
  67.      * @throws ClassNotFoundException 
  68.      */  
  69.     private Person deSerialization(String str) throws IOException,  
  70.             ClassNotFoundException {  
  71.         startTime = System.currentTimeMillis();  
  72.         String redStr = java.net.URLDecoder.decode(str, "UTF-8");  
  73.         ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(  
  74.                 redStr.getBytes("ISO-8859-1"));  
  75.         ObjectInputStream objectInputStream = new ObjectInputStream(  
  76.                 byteArrayInputStream);  
  77.         Person person = (Person) objectInputStream.readObject();  
  78.         objectInputStream.close();  
  79.         byteArrayInputStream.close();  
  80.         endTime = System.currentTimeMillis();  
  81.         Log.d("serial""反序列化耗时为:" + (endTime - startTime));  
  82.         return person;  
  83.     }  
  84.   
  85.     void saveObject(String strObject) {  
  86.         SharedPreferences sp = getSharedPreferences("person"0);  
  87.         Editor edit = sp.edit();  
  88.         edit.putString("person", strObject);  
  89.         edit.commit();  
  90.     }  
  91.   
  92.     String getObject() {  
  93.         SharedPreferences sp = getSharedPreferences("person"0);  
  94.         return sp.getString("person"null);  
  95.     }  
  96.   
  97.     public void onclick(View v) {  
  98.         switch (v.getId()) {  
  99.         case R.id.button1:  
  100.             try {  
  101.                 saveObject(serialize(person));  
  102.             } catch (IOException e) {  
  103.                 // TODO Auto-generated catch block  
  104.                 e.printStackTrace();  
  105.             }  
  106.             break;  
  107.         case R.id.button2:  
  108.             try {  
  109.                 Person person = deSerialization(getObject());  
  110.                 Log.d("serial", person.toString());  
  111.             } catch (IOException e) {  
  112.                 // TODO Auto-generated catch block  
  113.                 e.printStackTrace();  
  114.             } catch (ClassNotFoundException e) {  
  115.                 // TODO Auto-generated catch block  
  116.                 e.printStackTrace();  
  117.             }  
  118.             break;  
  119.         default:  
  120.             break;  
  121.         }  
  122.     }  
  123.   
  124. }  


logcat的结果为:

 

0 0
原创粉丝点击