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)

相关推荐

  • SequoiaDB 2 . 8 . 4中显示的打开文件中的值是怎么来的?

    技术SequoiaDB v2.8.4显示的open files中的值怎么来的这篇文章主要介绍“SequoiaDB v2.8.4显示的open files中的值怎么来的”,在日常操作中,相信很多人在SequoiaDB v2

    攻略 2021年12月22日
  • 如何进行SpringMVC中ModelAndView的分析

    技术如何进行SpringMVC中ModelAndView的分析如何进行SpringMVC中ModelAndView的分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简

    攻略 2021年12月2日
  • C++如何实现操作符重载

    技术C++如何实现操作符重载这篇文章主要介绍了C++如何实现操作符重载,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 在C++

    攻略 2021年12月1日
  • python中list与字典的区别(python中list的常用方法有哪些)

    技术Python列表list与字典dict的相关操作有哪些这篇文章主要讲解了“Python列表list与字典dict的相关操作有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究

    攻略 2021年12月17日
  • 抖音点赞1.8元一单,抖音点赞技巧!

    技术抖音点赞1.8元一单,抖音点赞技巧!大家务必要可以客观的应对抖音短视频粉丝领域的收费标准价钱规范,并并不是贵的才算是好的自然也并不一定划算的价钱全是不靠谱的,只是要可以融合自身的要求选择专业靠谱的服务平台,而且必须可

    测评 2021年10月26日
  • snowflake官网怎么做的(snowflake讲解)

    技术Snowflake的独特技术优势是什么本篇文章为大家展示了Snowflake的独特技术优势是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。云端原生性Snowflake提出

    攻略 2021年12月23日