JAVA中对象序列化备忘

序列化的必要条件

JAVA中的对象如果需要序列化,需要实现Serializable接口

其中有个最佳实践是要生成一个serialVersionUID。

关于serialVersionUID

为什么要手动生成一个serialVersionUID?

当反序列化时会去验证序列化文件中的serialVersionUID是否与当前类的serialVersionUID一致,如果一致才会反序列化成功,否则会失败。如果不主动声明的话,JAVA虚拟机会自动生成一个,当我们对类进行了一些变更,比如增加了一个属性,这个serialVersionUID就会有变化,反序列化时就会有问题,所以手动添加这个属性是明智之举。

关于transient

如果属性声明时有transient,该属性将不参与序列化。

示例代码

import org.junit.jupiter.api.Test;
​
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
​
public class SerializableTest {
​
    @Test
    void testSerializable() throws IOException, ClassNotFoundException {
        DataVo dataVo = new DataVo();
        File file = new File("D:\\temp\\test-serialize");
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
        oos.writeObject(dataVo);
​
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
        dataVo = (DataVo) ois.readObject();
        System.out.println("value:"+dataVo.getValue());
    }
​
    public static class DataVo implements Serializable {
        private static final long serialVersionUID = -5694210138567365397L;
​
        private transient String value="hello world";
        private String name;
​
        public String getValue() {
            return value;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值