java-序列化

不用加Serializable也能序列化了(反正标题党)
直接上正文,普通的序列化就不说了,先上代码

public class Test implements Serializable{

    transient public Item item;

    private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        if (item == null) {
            item = new Item();
        }
        out.writeObject(item.a);
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        String a = (String) in.readObject();
        item = new Item();
        item.a = a;
    }

    public Item getItem() {
        return item;
    }

    public void setItem(Item item) {
        this.item = item;
    }
}

在加上transient 这个关键字之后, 如果还要进行序列化,那么必须得写write和read这两个钩子方法,不过Item这个类却可以不用实现Serializable接口。这是为什么呢
答案就是:写上Serializable标记接口,就是为了在ObjectOutputStream 中 writeObject(Object obj)这个方法中的通过一个判断语句

else if(obj instanceof Serializable) {
            writeOrdinaryObject(obj, desc, unshared);
        } 

有了这个标记才能被写入流中,但是在我们上面的代码中,我们直接重写了write方法,因为我们重写了方法,所以在调用的时候会自动调用我们写的write方法,跳过了这个步骤,所以Item可以不用实现Serializable接口。

关于这个的思考可以去看看大神的公众号(里面讲的比我说的清晰多了)
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值