JDK 1.7 java.io 源码学习之Serializable接口

本文详细介绍了Java对象序列化的过程,包括如何通过Serializable接口实现对象到字节序列的转换,以及反序列化回对象的方法。讨论了serialVersionUID的重要性和影响,以及在对象中存在引用对象时的序列化要求。此外,文章还探讨了如何通过writeObject()和readObject()方法自定义序列化策略,以及实现Externalizable接口进行更灵活的序列化控制。强调了序列化过程中static和transient关键字的作用,以及序列化和反序列化时属性顺序的一致性要求。
摘要由CSDN通过智能技术生成

Java 编程思想中是这么描述序列化的:
Java的对象序列化将那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象。这一过程甚至可通过网络进行,自动弥补不同操作系统之间的差异

对象序列化主要是为了支持如下两种主要特性:
一是Java的远程方法调用RMI,使存活于其他计算机上的对象使用起来就像是存活于本机一样。再者,对Java Beans来说,对象的序列化也是必需的,使用一个Bean时,在设计阶段对它的状态信息进行配置,并保存这些信息,在程序启动时进行后期恢复。

对象序列化为字节的过程:
创建某些OutputStream对象,然后将其封装在一个ObjectOutputStream对象内,调用writeObject()即可将对象序列化,并将其发送给OutputStream

字节序列还原为对象的过程:
创建某些InputStream对象,然后将其封装在一个ObjectInputStream对象内,调用readObject()即可还原为对象,还原回来的对象是Object,需要类型转换

对象序列化时基于字节的,要使用字节输入流/输出流

对象序列化不仅保存了对象的“全景图”,而且能追踪对象内所包含的所有引用

下面通过一些示例演示序列化相关的一些细节问题

反序列化回来的对象和原对象内容一致,但是一个新对象

class SerializableDemo implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = -707015875588596115L;

    private String name;

    public SerializableDemo(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        SerializableDemo other = (SerializableDemo) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "SerializableDemo [name=" + name + "]";
    }
}
public static void seri(SerializableDemo demo) {
    try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("my.txt"))) {
        oos.writeObject(demo);
        oos.flush();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static SerializableDemo desri() {
    try (ObjectInputStream oin = new ObjectInputStream(new FileInputStream("my.txt"))) {
        SerializableDemo demo = (SerializableDemo) oin.readObject();
        return demo;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}
SerializableDemo demo = new SerializableDemo("Tom");
seri(demo);
SerializableDemo newDemo = desri();
System.out.println(newDemo);
System.out.println(demo == newDemo); // false
System.out.println(demo.equals(newDemo))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值