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

前言

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

                             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

<span style="margin: 0px; padding: 0px; border: 0px; font-size: 14px; background: transparent;">package com.example.shareddatatest;

import java.io.Serializable;

public class Person implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	String name;
	int age;
	String address;
	String education;
	String tel;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getEducation() {
		return education;
	}

	public void setEducation(String education) {
		this.education = education;
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	String sex;

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", address=" + address
				+ ", education=" + education + ", tel=" + tel + ", sex=" + sex
				+ "]";
	}


}
</span>

MainActivity.java

package com.example.shareddatatest;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.List;

import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {
	Person person = null;
	long startTime = 0l;
	long endTime = 0l;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		person = new Person();
		person.setName("LULU");
		person.setSex("bitch");
		person.setAddress("北京海淀");
		person.setAge(20);
		person.setTel("1231312");
		person.setEducation("小学");
	}

	/**
	 * 序列化对象
	 * 
	 * @param person
	 * @return
	 * @throws IOException
	 */
	private String serialize(Person person) throws IOException {
		startTime = System.currentTimeMillis();
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
		ObjectOutputStream objectOutputStream = new ObjectOutputStream(
				byteArrayOutputStream);
		objectOutputStream.writeObject(person);
		String serStr = byteArrayOutputStream.toString("ISO-8859-1");
		serStr = java.net.URLEncoder.encode(serStr, "UTF-8");
		objectOutputStream.close();
		byteArrayOutputStream.close();
		Log.d("serial", "serialize str =" + serStr);
		endTime = System.currentTimeMillis();
		Log.d("serial", "序列化耗时为:" + (endTime - startTime));
		return serStr;
	}

	/**
	 * 反序列化对象
	 * 
	 * @param str
	 * @return
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
	private Object deSerialization(String str) throws IOException,
			ClassNotFoundException {
		startTime = System.currentTimeMillis();
		String redStr = java.net.URLDecoder.decode(str, "UTF-8");
		ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
				redStr.getBytes("ISO-8859-1"));
		ObjectInputStream objectInputStream = new ObjectInputStream(
				byteArrayInputStream);
		Object object = objectInputStream.readObject();
		objectInputStream.close();
		byteArrayInputStream.close();
		endTime = System.currentTimeMillis();
		Log.d("serial", "反序列化耗时为:" + (endTime - startTime));
		return object;
	}

	void saveObject(String strObject) {
		SharedPreferences sp = getSharedPreferences("person", 0);
		Editor edit = sp.edit();
		edit.putString("person", strObject);
		edit.commit();
	}

	String getObject() {
		SharedPreferences sp = getSharedPreferences("person", 0);
		return sp.getString("person", null);
	}

	public void onclick(View v) {
		switch (v.getId()) {
		case R.id.button1:
			try {
				saveObject(serialize(person));
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			break;
		case R.id.button2:
			try {
				Person person = (Person)deSerialization(getObject());
				Log.d("serial", person.toString());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			break;
		default:
			break;
		}
	}

}

logcat的结果为:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值