要想将父类对象也序列化,就需要让父类也实现Serializable 接口。如果父类不实现的话的,就 需要有默认的无参的构造函数。在父类没有实现 Serializable 接口时,虚拟机是不会序列化父对象的,而一个 Java 对象的构造必须先有父对象,才有子对象,反序列化也不例外。所以反序列化时,为了构造父对象,只能调用父类的无参构造函数作为默认的父对象。
如果子类实现了java.io.Serializable,但父类没有实现此接口,子类的值域保留下来了,但是父类的值域丢失了,这对jvm 来说是正常的,因为父类不可序列化。为了解决这个问题,只能自定义序列化行为,在序列化的默认动作之后将父类里值域写入流或写出流,顺序要一致。
自定义序列化有两种:
1.实现java.io.Serializable,重写private void writeObject(ObjectOutputStream os) throws IOException
private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException ,执行默认序列化外( 先调用outputStream.defaultWriteObject();或 inputStream.defaultReadObject();),可以控制声明为static或transient的数据成员。
2.实现java.io.Externalizable,要有无参数的默认构造函数,重写void writeExternal(ObjectOutput out) throws IOException;
void readExternal(ObjectInput in) throws IOException, ClassNotFoundException; 完全负责序列化和恢复数据成员,除了头以外,根本没有自动序列化。实现了这个接口就不会调用1中的两个方法。
当进行序列化的时候:
首先JVM会先调用writeReplace方法,在这个阶段,我们可以进行张冠李戴,将需要进行序列化的对象换成我们指定的对象.
跟着JVM将调用writeObject方法,来将对象中的属性一个个进行序列化,我们可以在这个方法中控制住哪些属性需要序列化.
当反序列化的时候:
JVM会调用readObject方法,将我们刚刚在writeObject方法序列化好的属性,反序列化回来.
然后在readResolve方法中,我们也可以指定JVM返回我们特定的对象(不是刚刚序列化回来的对象).
注意到在writeReplace和readResolve,我们可以严格控制singleton的对象,在同一个JVM中完完全全只有唯一的对象,控制不让singleton对象产生副本.
在此writeExternal 和readExternal 的作用与writeObject和readObject 一样,当我们同时实现了两个interface的时候,JVM只运行Externalizable 接口里面的writeExternal 和readExternal 方法对序列化内容进行处理。
参考https://www.ibm.com/developerworks/cn/java/j-lo-serial/
http://201211131343.iteye.com/blog/1772780
相关推荐
主要介绍了实例解析Json反序列化之ObjectMapper,json自定义序列化的方法,需要的朋友可以了解下。
jackson工具库,支持JSON,XML格式实现java序列化反序列化操作。在XML格式进行反序列化时有一定的限制
本文通过分析ArrayList的序列化来介绍Java序列化的相关内容。主要涉及到以下几个问题: 怎么实现Java的序列化 为什么实现了java.io.Serializable接口才能被序列化 transient的作用是什么 怎么自定义序列...
实现了通过gson对enum的自定义转化过程,不需要预先定义enmu,并且不需要修改gson源码,在框架顶层处理基本可以达到对enum的抽象管理。
应用于java开发 在使用redis缓存时 由于多线程问题造成数据同步延迟 解决redis缓存穿透问题
springboot工程通过自定义response注解、java反射机制、自定义java拦截器、自定义功能类实现WebMvcConfigurer接口等功能,实现自定义规范化返回数据结构。
本篇文章主要介绍了java如何利用FastJSON、Gson、Jackson三种Json格式工具自定义时间序列化,具有一定的参考价值,有兴趣的可以了解一下
主要介绍了 Java 序列化详解及简单实现实例的相关资料,使用序列化目的:以某种存储形式使自定义对象持久化,将对象从一个地方传递到另一个地方,需要的朋友可以参考下
案1:修改序列化byte数据该法可解决序列化最终数据的serialVesionUID不致,但法解决Object的serialVesionUID不案2:反射修改s
如果可用,数据绑定和“流”(自定义打包和解包)实现都经过测试。 使用 1、10、100 和 1000 KB 大小的有效负载评估两种不同类型: :使用原始类型、字符串、列表和简单的 POJO; 和 : 添加数组、枚举、UUID、...
做一个WebService,把前台和后台分离开,在ebService上得到数据是datatable,利用序列化转换成xml进行传输,再在客户端反序列化成datatable,在其中用到了反射,自定义属性等
目标提供简单的toJson()和fromJson()方法将Java对象转换为JSON,反之亦然允许将已有的不可修改的对象与JSON相互转换Java泛型的广泛支持允许对象的自定义表示支持任意复杂的对象(具有深层继承层次结构和泛型类型的...
本文主要在.NET平台上对比Hprose与.NET平台中提供的各种序列化方式的比较,序列化并不是Hprose的全部,但它是Hprose的核心部分之一,通过对序列化的比较,我们就可以对Hprose的性能有一个大概的了解了。 Hprose提供...
根据XML定义的结构,在字节数组和POJO之间进行序列化和反序列化。 注意 0.5.1或更高版本支持Android平台。 特征 使用XML定义数据结构。 将字节数组映射到POJO。 支持自定义数据类型。 使用基本算术计算大小或...
中文 | 功能容易上手,安装即可快速使用基于注解和JSONPath工作的反序列化/序列化流程,直观、方便、容易使用支持复杂实体类和变量的反序列化等对泛型的良好支持不断更新的内置注解,方便处理数据可自定义注解,...
当自定义一个类之后,如果想要产生的对象在hadoop中进行传输,那么需要 这个类实现Writable的接口进行序列化/反序列化 案例:统计每个人产生的总流量 数据源 自定义类序列化 import java.io.DataInput; import java...
JSON格式数据序列化和反序列化 XML格式数据序列化和反序列化 Protobuf格式数据序列化和反序列化 JSON、XML或其他类型转换器可以随意扩展和替换 支持JSON转换框架: Fastjson, Jackson, Gson 支持JAXB形式的XML转换 ...
它允许发送纯文本(JSON,XML,CSV或任何其他自定义格式)类型的kafka消息以及Java序列化的对象。 入门 Pepper-Box包含四个主要组件 PepperBoxKafkaSampler :这是jmeter Java采样器将消息发送到kafka。 Pepper-...
Morphia/Jackson Java 8 可选示例Morphia (mongoDB) 和 Jackson (JSON) 序列化都可以用来序列化/反序列化新的 Java 8 Optional 类型。 对于 Jackson,您只需要注册 JDK8 模块。 对于 Morphia,您需要为 Optional ...
Gson-示例 Gson 库的基本用法,以便将 Java 对象序列化和反序列化为 Json。 此外,还有一些 Gson 库的高级功能,如自定义序列化器、排除策略等。