android 序列化 xml serializable,解析Android中的Serializable序列化

1、为何要序列化?

-- 把内存中的java对象能够在磁盘上持久保存

-- 通过网络传输对象

-- 通过RMI(Remote Method Invocation 远程过程调用)传输。

通过序列化可以把对象转化为与平台无关的二进制流,在重新使用前进行反序列化,重新转化为java对象。

(远程过程调用针对分布式Java应用,对开发人员屏蔽不同JVM和网络连接等细节,是的分布在不同JVM上的对象似乎存在于一个统一的JVM中,能够方便的通讯)

2、如何让Java对象可以被序列化?

在java里只需让目标类实现Serializable接口,无须实现任何方法。Serializable接口是一种标记接口,用来标明某个类可以被序列化。

3、如何使用序列化与反序列化?

序列化:使用ObjectOutputStream对象输出流的writeObject()方法,可以把对象写到输出流中。

反序列化:使用ObjectInputStream对象写入流的readObject()方法,并强制转换为已知的目标类即可。

4、对象引用的序列化

如果一个类Person某个成员变量引用了其他类(如class PersonInfo)。即:

class Person implements Serializable{

String name;

PersonInfo info;

}

如果想将Person类进行序列化,那么必须要满足:PersonInfo类也能够序列化,即也实现了Serializable接口,

class PersonInfo implements Serializable

5、多个对象引用同一个子对象

PersonInfo info = new PersonInfo(“male”,"china");

Person xiaomi = new Person("小明",info);

Person dabai = new Person("大白",info);

如果依次对上面三个对象序列化,原本是下面两个对象都指向上面同一个对象,也就是指存在一个info对象,java为了防止在每个对象序列化时序列化三个info对象,设定了如果多次序列化同一样java对象时,只有在第一次序列化时把这个对象转换为字节序列输出,之后再对它序列化只会指向第一次序列化的编号,而不会再去序列化这个对象。

6、父类序列化

如果父类实现了Serializable接口,则子类自动可序列化,不需要再显示实现该接口。

7、利用Serializable保存自定义数据至本地的例子MainActivity如下:

package cc.test.serializable;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.util.ArrayList;

import android.app.Activity;

import android.os.Bundle;

import android.os.Environment;

/**

* Demo描述:

* 将ArrayList在SDCard上进行存取.

*

* Parcelable和Serializable的区别:

* 内存间数据传输时推荐使用Parcelable,如activity间传输数据

* 比如:http://blog.csdn.net/lfdfhl/article/details/10961459

* 保存到本地或者网络传输时推荐使用Serializable

*/

public class TestSerializableActivity extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

testSerializable();

}

private void testSerializable() {

FileOutputStream fileOutputStream=null;

ObjectOutputStream objectOutputStream =null;

FileInputStream fileInputStream = null;

ObjectInputStream objectInputStream = null;

ArrayList studentsArrayList = new ArrayList();

Student student = null;

for (int i = 1; i < 5; i++) {

student = new Student(i, "小明" + i);

studentsArrayList.add(student);

}

try {

//存入数据

File file = new File(Environment.getExternalStorageDirectory().toString()

+ File.separator +"Test"+File.separator + "data.dat");

if (!file.getParentFile().exists()) {

file.getParentFile().mkdirs();

}

if (!file.exists()) {

file.createNewFile();

}

fileOutputStream= new FileOutputStream(file.toString());

objectOutputStream= new ObjectOutputStream(fileOutputStream);

objectOutputStream.writeObject(studentsArrayList);

//取出数据

fileInputStream = new FileInputStream(file.toString());

objectInputStream = new ObjectInputStream(fileInputStream);

ArrayList savedArrayList =(ArrayList) objectInputStream.readObject();

for (int i = 0; i < savedArrayList.size(); i++) {

System.out.println("取出的数据:" + savedArrayList.get(i).toString());

}

} catch (Exception e) {

// TODO: handle exception

}finally{

if (objectOutputStream!=null) {

try {

objectOutputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (fileOutputStream!=null) {

try {

fileOutputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (objectInputStream!=null) {

try {

objectInputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (fileInputStream!=null) {

try {

fileInputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

}

Student如下:

package cc.test.serializable;

import java.io.Serializable;

public class Student implements Serializable {

private Integer id;

private String name;

//注意定义此字段

public static final long serialVersionUID = 9527L;

public Student() {

super();

}

public Student(Integer id, String name) {

super();

this.id = id;

this.name = name;

}

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public String toString() {

return "Student [id=" + id + ", name=" + name + "]";

}

}

main.xml如下:

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello" />

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值