博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我所理解的JDK序列化
阅读量:6830 次
发布时间:2019-06-26

本文共 1161 字,大约阅读时间需要 3 分钟。

hot3.png

1,什么是序列化?

  Java中的对象存在与JVM中,当JVM关闭后对象就不存在了。为了复用对象,可以将对象表示为一个字节流序列,该字节流序列被反序列化为Java对象时的数据和类型信息与被序列化之前一致。

2,什么场景需要序列化?

  当前的JVM需要与外接进行交互的场景。比如,使用Redis或MQ或文件存储等持久化Java对象的场景、WebService等跨系统共享对象等场景。

3,序列化方法?

1、JDK自身提供了序列化Java对象的方法

  • 对象需要实现Serializable接口,该接口没有任何需要重写的方法。生成private static final long serialVersionUID。如果serialVersionUID不相同,为了防止反序列化对虚拟机造成伤害,反序列化错。
  • 被transient关键字修饰的属性是不参与序化。
  • 如果对象中有 private void writeObject(ObjectOutputStream out) 或者 private void readObject(ObjectInputStream in)的话,Serializable接口会调用该方法进行序列化与反序化。
  • transient关键字、writeObject()、readObject()都是在对象实现Serializable接口的情况下效。
  • 对象实现Externalizable接口,重写writeExternal(ObjectOutput out) 和 readExternal(ObjectInput in)方法来更灵活的实现序列化与反序列化。

2、JSON形式的序列化

  可以使用Alibaba提供的FastJson或者Google的gson来将对象序列化为json字符串进行传输(xml字符串也可以)。特点是很直观。

3、Google protostuff

  Google出品,比较强大,推荐使用。支持序列化的ClassA和反序列化的ClassB可以是不同的包路径和类名,支持前后相同属性名的类型可以不同(比如int转long)。参见
  特点是灵活、跨语言、效率高。

4、其他工具,如 Kryo、Hessian等

注意

  1. Serializable接口反序列化时类的全路径必须相同。
  2. 父类实现了Serializable接口,子类可以不实现,但建议子类要拥有自己的serialVersionUID。
  3. 当一个对象的实例变量引用了其他对象,被引用的对象也会序列化。
  4. 反序列化不会改变当前JVM类的静态变量的值。

参考资料:

  1. 以上内容为笔者日常琐屑积累,已无从考究引用。如果有,请站内信提示。

转载于:https://my.oschina.net/u/3466682/blog/1585980

你可能感兴趣的文章
MVC中过虑特殊字符检测
查看>>
prototype和_proto_区别
查看>>
浮动双飞翼布局
查看>>
P5068 [Ynoi2015]我回来了
查看>>
LOJ#557. 「Antileaf's Round」你这衣服租来的吗(FHQ Treap+珂朵莉树)
查看>>
what is spring and what is spring for
查看>>
Python 函数基础2 实参与形参
查看>>
H5 canvas控制坦克移动2
查看>>
COGS 2396 2397 [HZOI 2015]有标号的强连通图计数
查看>>
CF997C Sky Full of Stars
查看>>
iphone-common-codes-ccteam源代码 CCDebug.h
查看>>
iphone-common-codes-ccteam源代码 CCPoint.m
查看>>
Fetch from Upstream 变灰失效
查看>>
error: Invalid temp directory in chart handler configuration [c:\TempImageFiles\] -> asp:Chart
查看>>
小程序自定义导航栏
查看>>
JAVA 复制对象需要注意
查看>>
markdown 语法指南
查看>>
JMeter安装过程小问题
查看>>
Codeforces 894B - Ralph And His Magic Field
查看>>
利用C语言中的函数指针实现c++中的虚函数
查看>>