Android之序列化
来源:互联网 发布:java字符串转换成date 编辑:程序博客网 时间:2024/05/17 06:53
序列化是什么
序列化是指把Java对象转换为字节序列并存储到一个存储媒介的过程。反之,把字节序列恢复为Java对象的过程则称之为反序列化。
为什么要序列化
序列化的主要作用是:
- 永久性保存对象,保存对象的字节序列到本地文件中;
- 通过序列化对象在网络中传递对象;
- 通过序列化在进程间传递对象。
Android中序列化
在Android开发中,经常需要在多个部件(Activity、Fragment或Service)之间通过Intent传递一些数据,如果是一些普通类型的数据可以通过PutExtra()进行传递,如果是对象的话就得先进行序列化才能传递了。在Android中有两种序列化的接口,Serializable和Parcelable。
- Serializable:(JavaSE本身就支持的)保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输。
- Parcelable:(Android特有功能)因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效
的传输数据而设计,这些数据仅在内存中存在。
何时使用它们
Parcelable的效率会比Serializable高,数据仅存在于内存中。而Serializable因为使用到了反射,会相对慢一些,因此,只在内存间传递数据的话推荐用Parcelable,而如果是要进行保存或者网络传输则选择Serializable。
最近在做用户注册的时候,遇到了需要填写很多表单数据,由于表单的数据,一般都是一个实体类,可以进行序列化的,序列化本身的目的是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。说白了,最终就是转换成了二进制数据,解决思路如下:
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(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 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", 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 = 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 0
- android之序列化
- Android之序列化
- Android之序列化
- Android序列化之Parcelable
- Android序列化之Parcel
- Android深究之序列化
- Android IPC之序列化
- Android之序列化浅析
- Android开发之序列化接口
- Android之XML序列化和解析
- Android开发篇之对象序列化
- Android笔记之对象序列化
- android序列化之Serializable,Parcelable
- Android学习之xml序列化
- Android 序列化之 Parcelable 接口
- Android 序列化之Serializable和Parcelable
- Android之Intent 序列化反序列化
- android之XmlSerializer序列化XML(写入)
- python的datetime和unix时间戳之间相互转换
- Head First 命令模式
- jq extend
- Embitz 使用ARM GCC Compiler(generic) 兼容性问题<signal handler called>
- 一元二次方程
- Android之序列化
- 运算符
- 二分法查找法
- Leetcode_22
- 全排列
- 相互转换 时间类
- 手把手教你做音乐播放器(四)播放服务的搭建
- Windows下的程序放到linux下面不能执行的问题
- Docker镜像的创建、存出、载入