首页 / JAVA / JAVA对象序列化和反序列化学习
JAVA对象序列化和反序列化学习
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JAVA对象序列化和反序列化学习,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1760字,纯文字阅读大概需要3分钟。
内容图文
![JAVA对象序列化和反序列化学习](/upload/InfoBanner/zyjiaocheng/1242/f8390fdeb03d470681186889334e50c5.jpg)
JAVA序列化就是将JAVA对象转化为字节序列的过程,而JAVA反序列化就是将字节序列转化为JAVA对象的过程。
这一过程是通过JAVA虚拟机独立完成,所以一个对象序列化后可以在任意时间和任意机器上反序列化得到该对象。
在这之前,我对序列化与反序列化一直是只有个模糊的了解,心中对此一直有一个疑问。
序列化为什么需要实现Serializable或者Externalizable
刚开始的时候我觉着为什么不直接所有类默认都可以序列化,非要去实现一个空的接口。后来我看了看了一篇博客,他说的是有些类是不能序列化的,因为序列化类是会将私有属性暴漏出来。并且指出具有四类特性的类不能或者不需要序列化:
1)太依赖于底层实现的类(too closely tied to native code)。比如java.util.zip.Deflater
2)对象的状态依赖于虚拟机内部和不停变化的运行时环境。比如java.lang.Thread, java.io.InputStream
3)涉及到潜在的安全性问题。比如:java.lang.SecurityManager, java.security.MessageDigest
4)全是静态域的类,没有对象实例数据。要知道静态域本身也是存储在方法区中的
1、Serializable
Serializable提供了两种方式进行对象的序列化.
1)采用默认序列化方式,将非transatient和非static的属性进行序列化
2)编写readObject和writeObject方法完成部分属性的序列化
若不希望某个类中的某个属性给序列化,则使用transatient修饰符修饰该属性。静态属性默认是不会进行序列化的。
2、Serializable的serialVersionUID的作用
序列化操作时会把系统当前类的serialVersionUID写入到序列化文件中,当反序列化时系统会自动检测文件中的serialVersionUID,判断它是否与当前类中的serialVersionUID一致。如果一致说明序列化文件的版本与当前类的版本是一样的,可以反序列化成功,否则就失败。
serialVersionUID有两种显示的生成方式:
一是默认的1L,比如:private static final long serialVersionUID = 1L;
二是根据包名,类名,继承关系,非私有的方法和属性,以及参数,返回值等诸多因子计算得出的,极度复杂生成的一个64位的哈希字段。基本上计算出来的这个值是唯一的。
如果不显示生成,则是根据包名,类名,继承关系,非私有的方法和属性,以及参数,返回值等诸多因子,生成一个默认的serialVersionUID。基本上计算出来的这个值是唯一的。只要稍微改动类的定义,这个类的serialVersionUID就会发生变化,之前序列化的对象就无法被该类反序列化。
Serializable接口实现,反序列化采用反射机制完成内容恢复,没有一定要有无参构造函数的限制。
3、Externalizable
JAVA类想要能够序列化除了实现Serializable接口,还可以实现Externalizable接口,Externalizable接口的定义如下:
public interface Externalizable extends java.io.Serializable { void writeExternal(ObjectOutput out) throws IOException; void readExternal(ObjectInput in) throws IOException, ClassNotFoundException; }
如果一个类要使用Externalizable实现序列化时,在此类中必须存在一个无参构造方法,因为在反序列化时会默认调用无参构造实例化对象,然后将属性值给设置进去,如果没有此无参构造,则运行时将会出现异常。无需产生serialVersionUID
原文:https://www.cnblogs.com/zxb1996/p/serialization.html
内容总结
以上是互联网集市为您收集整理的JAVA对象序列化和反序列化学习全部内容,希望文章能够帮你解决JAVA对象序列化和反序列化学习所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。