您的位置:首页 > 编程语言 > Java开发

Java之一:Serialization(序列化…

2014-07-19 14:18 369 查看
本博文主要介绍Java Serialization(序列化)的定义、实现、特点、接口、算法和实例
Java序列化的定义:

Java Serialization(序列化)是将对象或者对象树的状态转化为Byte流,经过网络传播或者存储,最后被其他地方读取并重新构造一个相同的对象的过程。目的是为了解决对对象流进行读写操作时所引发的问题。

Java序列化的实现:

将需要被序列化的类实现Serializable接口,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,使用其writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流ObjectInputStream。

Java序列化的特点:

1. 如果某个类能够被串行化,其子类也可以被串行化。

2. 对于父类的处理,如果父类没有实现串行化接口,则其必须有默认的构造函数(即没有参数的构造函数)。否则编译的时候就会报错。在反串行化的时候,默认构造函数会被调用。但是若把父类标记为可以串行化,则在反串行化的时候,其默认构造函数不会被调用。这是因为Java 对串行化的对象进行反串行化的时候,直接从流里获取其对象数据来生成一个对象实例,而不是通过其构造函数来完成。

3. 声明为static和transient类型的成员数据不能被串行化。因为static代表类的状态, transient代表对象的临时数据;

Java序列化的接口:

1. ObjectOutput接口:它继承DataOutput接口并且支持对象的串行化,其内的writeObject()方法实现存储一个对象。

2. ObjectOutputStream类:它继承OutputStream类并且实现ObjectOutput接口。利用该类来实现将对象存储(调用ObjectOutput接口中的writeObject()方法)。

3. ObjectInput接口:它继承DataInput接口并且支持对象的串行化,其内的readObject()方法实现读取一个对象。

4. ObjectInputStream类:它继承InputStream类并且实现ObjectInput接口。利用该类来实现读取一个对象(调用ObjectInput接口中的readObject()方法)。

Java的序列化算法

1. 将对象实例相关的类元数据输出。

2. 递归地输出类的超类描述直到不再有超类。

3. 类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值。

4. 从上至下递归输出实例的数据

Java序列化的实例:

User类
import java.io.Serializable;
public class User implements Serializable{

Long userid = 0L;
String username = null;
public User(Long userid , String username){

this.userid = userid;

this.username = username;

}

}

Write类
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
public class Write {

public static void main(String[] args) throws IOException{

FileOutputStream fos = new FileOutputStream("F:\\test.out");

ObjectOutputStream oos = new ObjectOutputStream(fos);

User u1 = new User(1L,"evan");

User u2 = new User(2L,"evan");

ArrayList u = new ArrayList();

u.add(u1);

u.add(u2);

oos.writeObject(u);//该方法描述了如何进行二进制转化,主要由writeObject0()执行

oos.flush();

oos.close();

}

}

Read类
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;
public class Read {

public static void main(String[] args) throws IOException,ClassNotFoundException {

FileInputStream fis = new FileInputStream("F:\\test.out");

ObjectInputStream oin = new ObjectInputStream(fis);

ArrayList al = (ArrayList) oin.readObject();//该方法描述了如何从二进制解析成对象,主要由ReadObject0()执行

for (User u : al) {

System.out.println(u.userid);

System.out.println(u.username);

}

}

}

执行结果为:
1
evan
2
evan

由于博主知识有限,如有误,请指正点评,欢迎交流
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: