序列化 与 反序列化
序列化
Class ObjectOutputStream
java.lang.Object
java.io.OutputStream
java.io.ObjectOutputStream实现接口
Closeable , DataOutput , Flushable , ObjectOutput , ObjectStreamConstants , AutoCloseable
可以通过使用流的文件来实现对象的持久存储
如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象(发个文件到另一台电脑实现对象)
注意:
- 实现重构的对象必须实现 Java.io.Serializable 接口
- 重构对象的属性也必须实现 Java.io.Serializable 接口
以上说明是实现重构对象的前提
构造方法
ObjectOutputStream()
ObjectOutputStream(OutputStream out)
方法 (方法自行API)
反序列化
Class ObjectInputStream
java.lang.Object
java.io.InputStream
java.io.ObjectInputStream实现接口
Closeable , DataInput , ObjectInput , ObjectStreamConstants , AutoCloseable
ObjectInputStream用于恢复先前序列化的对象
构造方法
ObjectInputStream()
ObjectInputStream(InputStream in)
方法 (方法自行API)
序列化限制
指定对象部分属性序列化
实现方式:
- 对象属性用 transient 修饰符 限制属性序列化
- 对象属性用 static 修饰符 限制属性序列化
- 对象实现 writeObject()方法 和 readObject()方法 进行对指定属性进行实例化
注意:
方法3 ,writeObject()方法 和 readObject()方法 必须是 私有 无返回,否则无效
//模板
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
//写
private void writeObject(ObjectOutputStream out) throws IOException
//读
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
代码实例
Main类 (写入操作)
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
MySerializableUtil su = new MySerializableUtil();
//数据处理 ,储存
People p = new People("柏竹" , 20 , null);
List<String> childrenName = new ArrayList<>();
childrenName.add("黑猫");
childrenName.add("大鲸");
childrenName.add("白兔");
HaveAll haveAll = new HaveAll(7654321 , "网球" , 3);
haveAll.setChildrenName(childrenName);
p.setHaveAll(haveAll);
System.out.println("原始数据 : "+ p);
//数据 序列化
String fileName = "Date.txt";
try {
MySerializableUtil.