前言

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

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

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
+ "]";
} }

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();
person.setTel("");
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 Person 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);
Person person = (Person) objectInputStream.readObject();
objectInputStream.close();
byteArrayInputStream.close();
endTime = System.currentTimeMillis();
Log.d("serial", "反序列化耗时为:" + (endTime - startTime));
return person;
} void saveObject(String strObject) {
SharedPreferences sp = getSharedPreferences("person", );
Editor edit = sp.edit();
edit.putString("person", strObject);
edit.commit();
} String getObject() {
SharedPreferences sp = getSharedPreferences("person", );
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 = 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的结果为:

Android中SharedPreferences和序列化结合保存对象数据的更多相关文章

  1. android中sharedPreferences的用法

    SharedPreferences介绍:   做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连接跟操作等 ...

  2. android中sharedPreferences的用法(转)

    SharedPreferences介绍:   做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连接跟操作等 ...

  3. Android中使用HttpURLConnection实现GET POST JSON数据与下载图片

    Android中使用HttpURLConnection实现GET POST JSON数据与下载图片 Android6.0中把Apache HTTP Client全部的包与类都标记为deprecated ...

  4. 缓存AsimpleCache -- 解决Android中Sharedpreferences无法存储List数据/ASimpleCache

    Sharedpreferences想必大家在项目中都经常会用到,但是如果需要在本地需要存储比较多的数据,存储一个集合的时,发现Sharedpreferences并不 是那么好使了. 分析 如果需要在本 ...

  5. android中SharedPreferences

    SharedPreferences:用于存储少量并且数据格式简单,基本上都是普通的字符串,标量类型的值,比如:应用程序的各种配置信息等. SharedPreferences:保存的数据格式主要是key ...

  6. android中SharedPreferences 读取不到数据的问题

    在两个不同的 Activity中,A中SharedPreferences保存了数据,在A中可以读取到,但是在 B中却读取不到了,一直是空值,好是不爽,由于是按照书本上的例子写的, 怎么也找不到原因,后 ...

  7. 【转载】如何在Android中避免创建不必要的对象

    在编程开发中,内存的占用是我们经常要面对的现实,通常的内存调优的方向就是尽量减少内存的占用.这其中避免创建不必要的对象是一项重要的方面. Android设备不像PC那样有着足够大的内存,而且单个App ...

  8. android中使用Intent在activity之间传递数据

    android中intent传递数据的简单使用: 1.使用intent传递数据: 首先将需要传递的数据放入到intent中 Intent intent = new Intent(MainActivit ...

  9. android中使用intent来实现Activity带数据跳转

    大家都知道startActivity()是用来切换跳转Activity的.如果想要在另个Activity中出书数据的话.只需要在源activity中使用intent.putExtra()方法传出数据. ...

随机推荐

  1. http协议通信原理的问答

    1.dns怎么解析?答:假设一个网站www.tianyik.com的ip是192.168.31.36    浏览器(URL:www.tianyik.com)-->    客户机        h ...

  2. 后缀自动机(SAM)

    *在学习后缀自动机之前需要熟练掌握WA自动机.RE自动机与TLE自动机* 什么是后缀自动机 后缀自动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂度构造,能够接受一个字符 ...

  3. SQL小细节

    平时有些小细节,不留意的话很容易得到错误的答案,我们来看下下面的代码,看看你是否能答对呢? ) ,) SELECT @str = '中国CH',@info='MyTest' SELECT [字符串]= ...

  4. MySQL使用指南(上)

    作者:大金刚   有很多朋友虽然安装好了mysql但却不知如何使用它.在这篇文章中我们就从连接MYSQL.修改密码.增加用户等方面来学习一些MYSQL的常用命令. 一.连接MYSQL. 格式: mys ...

  5. SQL打印全年日历

    数据库环境:SQL SERVER 2008R2 我之前有写过打印本月日历的SQL,里头有详细的说明.具体请参考前面的博文——生成本月日历. 全年日历只是在本月日历的基础上加了月信息,并按月份分组求得. ...

  6. Mybatis的学习总结:mybatis的入门介绍

    一.myBatis简述 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  7. jQuery 遍历祖先

    祖先是父.祖父或曾祖父等等. 通过 jQuery,您能够向上遍历 DOM 树,以查找元素的祖先. 向上遍历 DOM 树 这些 jQuery 方法很有用,它们用于向上遍历 DOM 树: parent() ...

  8. 尝试封装自己的js库

    学了js,用过jquery,然后想着让自己在js这一块有更深的提高,就想尝试着封装自己的js库,偶尔就添加自己想到的功能.有参考过其他大牛封装库的方法,不懂的地方也有借鉴过,但代码还是自己想,自己理解 ...

  9. Javascript字符串拼接小技巧

    在Javascript中经常会遇到字符串的问题,但是如果要拼接的字符串过长就比较麻烦了. 如果是在一行的,可读性差不说,如果要换行的,会直接报错. 在此介绍几种Javascript拼接字符串的技巧. ...

  10. vector预分配空间溢出

    vector 当一个vector预分配的存储空间用完之后,为维护其连续的对象数组,它必须在另外一个地方重新分配大块新的(更大的)存储空间,并把以前已有的对象拷贝到新的存储空间中去. // A clas ...