Java 序列化和反序列化总结

1.背景

序列化:将对象写入到IO流中, serialization
反序列化:从IO流中恢复对象, deserialization

2.实现

2.1 接口Serializable

java.io.Serializable
系统自动存储必要的信息
transient 关键字
@Transient 注解

2.2 接口Externalizable

java.io.Externalizable
程序员决定存储哪些信息
必须实现writeExternal和readExternal方法
类似:

public calss ExPerson implement Externalizable {
	 private  String  name;
	 private  int  age;
	 
	 public ExPerson() {
	 }
	 public ExPerson(String name, int age){
	 }
     @Override
     public void writeExternal(ObjectOutput out) throws IOException {
         StringBuffer  reverse = new StringBuffer(name).reverse();
         out.writeObject(reverse);
         out.writeInt(age);
     }
     @Override
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
     	this.name=((StringBuffer)in.readObject()).reverse().toString();
     	this.age=in.readInt();
     }
}

2.3 序列化版本号

serialVersionUID, 保证兼容性

public class Person implements Serializable {
    //序列化版本号
	private static final long serialVersionUID = 11112222L;
	private String name;
	private int age;
}

反序列化class的版本号跟序列化中不一致,会抱InvalidClassException异常。

  • 注意:序列化版本号可自由指定,如不指定,JVM会根据类信息自己计算一个版本号,随着class的升级,就无法正确反序列化。不指定序列化版本另一个明显隐患,不利于jvm间的移植,JVM的计算规则不一样。

2.4 普通序列化

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.txt"));
oss.writeObject(person);

2.4 普通反序列化

import java.io.FileInputStream;
import java.io.ObjectInputStream;

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.txt"));
Person person =Person)ois.readObject();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值