Java自定义序列化行为的示例分析

技术Java自定义序列化行为的示例分析这篇文章给大家分享的是有关Java自定义序列化行为的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。正常情况下,一个类实现java序列化很简单,只需

本文将与您分享关于Java自定义序列化行为的示例分析的内容。我觉得边肖很实用,就和大家分享一下作为参考。让我们跟着边肖看一看。

通常情况下,一个类实现java序列化非常简单,只需要实现Serializable接口,然后在跨jvm传输的过程中,根据默认的java序列化规则对该类进行序列化和反序列化。不同的jvm版本有稍微不同的序列化方法,但是它们基本上是兼容的。

在某些特殊情况下,可能需要自定义序列化和反序列化的行为。请参见以下示例:

Java代码

classabstractserializedmo { private intx,y;publicvoidinit(intx,inty){ this . x=x;this.y=y} publiintgetx(){ returnx;} publiintgety(){ returny;} public void prinxy(){ system . out . println(' x : ' x ';y : ' y);} } public class serializedemoextendsabstractserializedemoimplementserializable { privateintz;public serialisedemo(){ super . init(10,50);z=100}nbsp

;            public void printZ() {             super.printXY();             System.out.println("z:" + z);         }             public static void main(String[] args) throws IOException, ClassNotFoundException {             ByteArrayOutputStream bos = new ByteArrayOutputStream();             ObjectOutputStream out = new ObjectOutputStream(bos);             SerializeDemo sd = new SerializeDemo();             sd.printZ();             out.writeObject(sd);             ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));             SerializeDemo sd2 = (SerializeDemo) in.readObject();             sd2.printZ();         }     }

这段程序表示了一个可序列化的类继承自一个非序列化的有状态超类,期望的结果是,子类序列化以后传输并反序列化回来,原先的值域包括超类的值域都保持不变。

但是输出是:

Java代码

x:10;y:50    z:100    x:0;y:0    z:100

结果和期望不符,子类的值域保留下来了,但是超类的值域丢失了,这对jvm来说是正常的,因为超类不可序列化;

为了解决这个问题,只能自定义序列化行为,具体做法是在SerializeDemo里加入以下代码:

Java代码

private void writeObject(ObjectOutputStream os) throws IOException {           os.defaultWriteObject();//java对象序列化默认操作           os.writeInt(getX());           os.writeInt(getY());       }           private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException {           is.defaultReadObject();//java对象反序列化默认操作           int x=is.readInt();           int y=is.readInt();           super.init(x,y);       }

writeObject和readObject方法为JVM会在序列化和反序列化java对象时会分别调用的两个方法,修饰符都是private,没错。

我们在序列化的默认动作之后将超类里的两个值域x和y也写入object流;与之对应在反序列化的默认操作之后读入x和y两个值,然后调用超类的初始化方法。

再次执行程序之后的输出为:

Java代码

x:10;y:50    z:100    x:10;y:50    z:100

另外还有两个自定义序列化方法writeReplace和readResolve,分别用来在序列化之前替换序列化对象 和 在反序列化之后的对返回对象的处理。一般可以用来避免singleTon对象跨jvm序列化和反序列化时产生多个对象实例,事实上singleTon的对象一旦可序列化,它就不能保证singleTon了。JVM的Enum实现里就是重写了readResolve方法,由JVM保证Enum的值都是singleTon的,所以建议多使用Enum代替使用writeReplace和readResolve方法。

Java代码

private Object readResolve()         {             return INSTANCE;         }                 private Object writeReplace(){             return INSTANCE;         }

注:writeReplace调用在writeObject前;readResolve调用在readObject之后。

感谢各位的阅读!关于“Java自定义序列化行为的示例分析”这篇文章就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/133163.html

(0)

相关推荐

  • 批量处理-单次异常-回滚单次内容

    技术批量处理-单次异常-回滚单次内容 批量处理-单次异常-回滚单次内容批量处理-单次异常-回滚单次内容
    批量任务,其中一批次异常,仅回滚 本批次整条线,但 批量任务中的其他任务不影响。解决方案:
    1.

    礼包 2021年12月16日
  • Java的流程控制语句有哪些

    技术Java的流程控制语句有哪些本篇内容介绍了“Java的流程控制语句有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成

    攻略 2021年10月25日
  • MongoDB的本质及怎么进行安装配置

    技术MongoDB的本质及怎么进行安装配置这期内容当中小编将会给大家带来有关MongoDB的本质及怎么进行安装配置,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。如果你从来没有接触Mon

    攻略 2021年11月3日
  • c++编译器(c++用什么软件编程)

    技术C++ OpenCV如何模拟实现微信跳一跳小编给大家分享一下C++ OpenCV如何模拟实现微信跳一跳,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!实机演示Gif:思路:获取小黑人的位置,获得目标方

    2021年12月17日
  • rman duplicate出现PLS-00201错误怎么办

    技术rman duplicate出现PLS-00201错误怎么办小编给大家分享一下rman duplicate出现PLS-00201错误怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这

    攻略 2021年11月17日
  • 如何全面解析Perl命令行应用

    技术如何全面解析Perl命令行应用本篇文章给大家分享的是有关如何全面解析Perl命令行应用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。和大家重点讨论一下P

    攻略 2021年11月12日