Java序列化基础

来源:互联网 发布:饥荒 知乎 编辑:程序博客网 时间:2024/06/05 08:32

Java中可序列化的类必须要实现Serializable接口或Externalizable接口,那么实现这两个接口的区别是什么呢。

若实现Serializable接口,若不做任何额外处理,类会有固定的序列化方式。即对所有的属性(除了transient和static关键字修饰的类型)进行序列化。若属性是基本类型,那当然很容易序列化,但属性若是对象的引用,那也会对引用的对象进行序列化,并且以此类推。若要实现自己独特的序列化/反序列化方式,就要覆盖writeObject和readObject方法了。如下:

private void writeObject(ObjectOutputStream out) throws IOException {          out.defaultWriteObject();          out.writeInt(age);      }private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {          in.defaultReadObject();          age = in.readInt();      }  
没错,可以调用ObjectOutputStream.defaultWriteObject()调用默认的序列化方式,然后就可以实现自己独特的序列化方式了;同样,可以调用ObjectIntputStream.defaultReadObject()调用默认的反序列化方式,同时也可以根据需要实现自己的反序列化方式。

若实现了Externalizable接口,类将不会有默认的序列化方法。这时候要实现类的序列化功能就要实现writeExternal和readExternal方法。如下:

@Overridepublic void writeExternal(ObjectOutput out) throws IOException {          out.writeObject(name);          out.writeInt(age);      @Overridepublic void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {          name = (String) in.readObject();          age = in.readInt();     }  

这样就实现了name和age属性的序列化和反序列化过程。


0 0
原创粉丝点击