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
由于博主知识有限,如有误,请指正点评,欢迎交流
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
由于博主知识有限,如有误,请指正点评,欢迎交流
相关文章推荐
- Java Serialization 序列化
- Java 序列化综述-由《Efficient Java serialization》说起
- java之序列化Serialization 机制
- 深入浅析Java Object Serialization与 Hadoop 序列化
- Java源码——对象序列化(对象的存储及读取)(Object Serialization)
- Java的序列化(Serialization)
- 回首Java——Java序列化机制(Serialization,Deserialization)
- Java序列化(Serialization)
- java中对象序列化(Serialization)的注意事项
- Thinking in java-39 序列化 Serialization
- Java Serialization序列化机制-学习笔记
- Java Serialization/序列化/反序列化
- 怎样做才能让Java 序列化机制 更安全 ? Security principles we follow to make Java Serialization safe.
- JAVA之序列化(Serialization)的理解
- Java 的序列化 (Serialization) 教程
- java中的序列化 serialization
- JAVA Serialization 序列化
- Java Serialization/序列化/反序列化
- Java 的序列化 (Serialization) 教程
- 深入分析Java的序列化(Serialization)