java实现序列化的接口_Java实现Exteralizable接口序列化

Java还提供了另一种序列化机制,这种序列化方式完全由程序员决定存储和恢复对象数据。要实现该目标,Java类必须实现Exteralizable接口,该接口里定义了如下两个方法。

90e5c0bf0cd9443046ce547adeeb8cc8.png void readExternal(ObjectInput in); 需要序列化的类实现readExternal()方法来实现反序列化。该方法调用Datalnput (它是Objectnput 的父接口)的方法来恢复基本类型的实例变量值,调用ObjectInput的readObject(方法来恢复引用类型的实例变量值。

90e5c0bf0cd9443046ce547adeeb8cc8.png void writeExternal(ObjectOutput out);: 需要序列化的类实现writeExternal()方法来保存对象的状态。该方法调用DataOutput ()它是ObjectOutput的父接口()的方法来保存基本类型的实例变量值,调用ObjectOutput的writeObject()方法来保存引用类型的实例变量值。实际上,采用实现Extermalizable 接口方式的序列化与前面介绍的自定义序列化非常相似,只是Externalizable接口强制自定义序列化。下面的Person类实现了Externalizable 接口,并且实现了该接口里提供的两个方法,用以实现自定义序列化。

publicclassPerson

implementsjava.io.Serializable

{

privateStringname;

privateintage;

publicPerson(Stringname,intage)

{

System.out.println("有参数的构造器");

this.name=name;

this.age=age;

}

publicvoidsetName(Stringname)

{

this.name=name;

}

publicStringgetName()

{

returnthis.name;

}

publicvoidsetAge(intage)

{

this.age=age;

}

publicintgetAge()

{

returnthis.age;

}

}

上面程序中的Person 类实现了javaio.Exteralizable 接口(如程序中第一行粗体字代码所示), 该Person类还实现了readExtemal()、 writeExternal()两个方法, 这两个方法除了方法签名和readObjectO.writeObject()两个方法的方法签名不同之外,其方法体完全一样。如果程序需要序列化实现Extemnalizable接口的对象,一样 调用ObjectOutputStream的writeObject()方法输出该对象即可;反序列化该对象,则调用ObjectInputStream的readObject()方法,此处不再赘述。

两种序列化机制的对比实现Serializable接口

实现Extermalizable接口

系统自动存储必要信息

程序员决定存储哪些信息

Java内建支持,易于实现,只需实现该接口即可,无须任何代码支持

仅仅提供两个空方法,实现该接口必须为两个空方法提供实现

性能略差

性能略好

虽然实现Externalizable接口能带来一定 的性能提升,但由于实现Externalizable 接口导致了编程复杂度的增加,所以大部分时候都是采用实现Serializable接口方式来实现序列化。

关于对象序列化,还有如下几点需要注意。

98dc4a4cd7ac39438eb9417825b48bdc.png对象的类名、实例变量(包括基本类型、数组、对其他对象的引用)都会被序列化;方法、类变量(即static修饰的成员变量)、transient 实例变量(也被称为瞬态实例变量)都不会被序列化。

9382f2194fe4db79cf0b90aeea819092.png实现Serializable接口的类如果需要让某个实例变量不被序列化,则可在该实例变量前加transient修饰符,而不是加static关键字。虽然static关键字也可达到这个效果,但static 关键字不能这样用。

6cc8aeeee9441b88a2afba5a81a7e876.png保证序列化对象的实例变量类型也是可序列化的,否则需要使用transient关键字来修饰该实例变量,要不然,该类是不可序列化的。

2d65573ff47c12a88bff75e5eacc64b3.png反序列化对象时必须有序列化对象的class文件。

ec6ea2363560cc9236b933c043170ee8.png当通过文件、网络来读取序列化后的对象时,必须按实际写入的顺序读取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值