Java之一:Serialization(序列化…

来源:互联网 发布:图片二维码识别软件 编辑:程序博客网 时间:2024/04/18 17:35

本博文主要介绍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 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 al) {

System.out.println(u.userid);

System.out.println(u.username);

}

}

}

执行结果为:

1

evan

2

evan


由于博主知识有限,如有误,请指正点评,欢迎交流

0 0
原创粉丝点击