Java序列化,何时需要实现Serializable?

 

何时需要实现Serializable接口?

Java中有一个接口是java.io.Serializable,实现这个接口,不用实现任何方法,这个接口就是一个标识作用,jvm在做序列化操作的时候,会去检查目标类有没有实现java.io.Serializable接口,没有实现的话,根据情况抛出异常:java.io.NotSerializableException。

这里我们需要明确的是哪些操作会去检查是否实现java.io.Serializable接口,一般而言,在将对象转换成流时,会去检查。比如转换成流进行网络传输,转换成流持久化到磁盘。

实际应用时,比如我们服务对外提供的接口时,返回的DTO对象需要实现java.io.Serializable接口吗?答案是一般不需要。我们返回给前端的数据,通常是JSON和XML,但是实际上这是一个String,String是实现了java.io.Serializable的,所以我们的DTO是不需要实现java.io.Serializable接口的。

除非你要将一个对象写入文件,此时就需要继承Serializable。如下,这种情况下的Object就需要implements Serializable。

    public static void writeObjectToFile(Object o, String path) {
        try {
            FileOutputStream fileOutputStream = new FileOutputStream(path);
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
            objectOutputStream.writeObject(o);
        } catch (Exception e) {
            e.printStackTrace();
            // ignore
        }
    }

    public static Object readObjectFromFile(String path) {
        try {
            FileInputStream fileInputStream = new FileInputStream(path);
            ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
            return objectInputStream.readObject();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
            // ignore
        }
    }

用不用指定serialVersionUID?

如果你不在对象中定义serialVersionUID,Java会隐式定义serialVersionUID,并根据规则设置值,这是一个危险的行为。serialVersionUID对象的版本号,因为一旦对象序列化到存储介质上,就相当于有了副本,就要考虑数据一致性,如果将对象序列化分发出去了,而对象又被修改,增加属性或改变属性,此时如果没有版本号做控制,是很难察觉这些变化的,所以,理论上serialVersionUID的使用方式就是,每当对象的field做了变更就应该将serialVersionUID改变,通常是递增,这样的话,当进行反序列化时,Java就可以得知序列化文件和对象的serialVersionUID是否匹配,如果不匹配,就会抛出异常:java.io.InvalidClassException,告知应用。所以我们实现Serializable接口后,应该定义serialVersionUID变量。

@Data
public class B implements Serializable {

    private static final long serialVersionUID = 1L;

    private String name;
}

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值