美国上市公司,专注Java培训21年

怎样对带有不可序列化属性的Java对象进行序列化


出于很多原因我们想使用自定义的序列化方法取代Java默认的机制。一个最常见的原因是提高性能,而另一个原因是有时候我们无法使用默认的序列化方法。在这篇文章中,我们具体来讨论怎样通过定制的序列化方法,对一个较大的、带有不可序列化属性的对象进行序列化。


下面这段代码定义了一个简单的类。它可以把一个给定的对象序列化到一个指定的文件,或者从相同的文件中把对象反序列化出来。在这片文章中,我将使用这个类进行演示。

SerializationDemonstrator.java

【怎样对带有不可序列化属性的java对象进行序列化】

【怎样对带有不可序列化属性的java对象进行序列化】

【怎样对带有不可序列化属性的java对象进行序列化】

下面这段代码给出了一个使用SerializationDemonstrator类序列化和反序列化标准的Java字符串的例子。字符串是支持序列化的。代码之后的截图显示了在Netbeans中运行该类的serialize和deserialize方法后的输出。

Running SerializationDemonstrator Methods on String

【怎样对带有不可序列化属性的java对象进行序列化】

下面这两段代码定义了Person和CityState两个类。CityState是Person的一个属性。可以看到尽管Person实现了Serializable接口,CityState却没有。

Person.java

【怎样对带有不可序列化属性的java对象进行序列化】

【怎样对带有不可序列化属性的java对象进行序列化】

CityState.java

【怎样对带有不可序列化属性的java对象进行序列化】

【怎样对带有不可序列化属性的java对象进行序列化】

下面这段代码演示了使用SerializationDemonstrator序列化Person类。由于包含了一个不可序列化的属性CityState,在之后截图里,我们可以看到Netbean抛出了异常。

Running SerializationDemonstrator Methods on Serializable Person with Non-Serializable CityState

怎样对不可序列化属性的java对象进行序列化

在这个例子里,由于CityState类是我们自己写的,我们可以使它支持序列化。但是如果这个类属于一个第三方的框架或者库,我们就很难去修改这个类。但是我们可以修改Person类,通过使用自定义的序列化和反序列化方法,使它和CityState类一起正常工作。下面这段代码定义了一个从Person类改过来的SerializablePerson类。

SerializablePerson.java

怎样对不可序列化属性的java对象进行序列化

怎样对不可序列化属性的java对象进行序列化

怎样对不可序列化属性的java对象进行序列化

在上面这段代码中,SerializablePerson有自定义的writeobject和readObject方法。它们以适当的方式处理CityState的序列化和反序列化。下面这段代码使用SerializationDemonstrator运行了这个类,我们可以看到这次的运行是成功的。

Running SerializationDemonstrator on SerializablePerson

怎样对不可序列化属性的java对象进行序列化

上面描述的这个方法可以允许我们在一个可序列化的类中使用不可序列化的属性,而且不需要transient。现在看上去已经挺不错了,但是如果前面这个CityState要在多个需要序列化的类中使用,更好的方式是用一个支持序列化的Decorator去修饰CityState。然后在那些需要做序列化的类中使用这个Decorator。下面这段代码定义了SerializableCityState。它是CityState的一个支持序列化的Decorator版本。

SerializableCityState.java

怎样对不可序列化属性的java对象进行序列化

怎样对不可序列化属性的java对象进行序列化

怎样对不可序列化属性的java对象进行序列化

这个可序列化的Decorator可以在Person类中直接使用。由于所有的属性都支持序列化,Person类可以使用默认的序列化方法。下面这段代码定义了一个从Person类改过来的Person2类。

Person2.java

怎样对不可序列化属性的java对象进行序列化

怎样对不可序列化属性的java对象进行序列化

下面这段代码运行了这个类。之后是NetBeans输出的截图。

Running SerializationDemonstrator Against Person2/SerializableCityState

怎样对不可序列化属性的java对象进行序列化

通过使用定制的序列化方法,可以在不使用transient的情况下,对一个带有不可序列化属性的类进行序列化。当你要在一个需要序列化的类中使用不可序列化的类型,并且这些类型不能被修改时,这是一个有用的技术。

感谢大家阅读由java培训机构分享的“怎样对带有不可序列化属性的Java对象进行序列化”更对精彩内容请关注Java培训官网

免责声明:本文由小编转载自网络,旨在分享提供阅读,版权归原作者所有,如有侵权请联系我们进行删除


【免责声明】本文部分系转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,如涉及作品内容、版权和其它问题,请在30日内与我们联系,我们会予以重改或删除相关文章,以保证您的权益!

Java开发高端课程免费试学

大咖讲师+项目实战全面提升你的职场竞争力

  • 海量实战教程
  • 1V1答疑解惑
  • 行业动态分析
  • 大神学习路径图

相关推荐

更多
  • java语言中,char 类型变量是否能保存一个汉字?
    java语言中,char 类型变量是否能保存一个汉字?
    在 Java 语言中,可以使用 char 类型的变量来存储单个的字符,请问是否能用 char 类型的变量来存储一个汉字呢? 详情>>

    2015-10-15

  • 有史以来最牛的一张程序员职业路线图!
    有史以来最牛的一张程序员职业路线图!
    最近在琢磨程序员到底路在何方,经过不断的自虐和代入,终于在迷雾森林中得图一张,看之豁然开朗。独乐乐不如众乐乐,share了: 详情>>

    2018-05-22

  • java中变量和常量有什么区别?
    java中变量和常量有什么区别?
    在使用 Java 语言进行程序设计时,经常需要用到常量和变量来存储信息。请简单叙述变量和常量有什么区别? 详情>>

    2015-10-15

  • short 和 char 类型的取值范围各是多少?
    short 和 char 类型的取值范围各是多少?
    在使用 Java 语言进行程序设计时,经常需要使用 short 型和 char 型存储数值,请简述short 型和 char 型的取值范围各是多少? 详情>>

    2015-10-15

  • Java开班时间

    收起