把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化。

对象的序列化主要有两种途径:

Ⅰ . 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中

Ⅱ.  在网络上传送对象的字节序列。

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

二、序列化API

1. 对象输出流(ObjectOutputStream)的常用方法:

2. 对象输入流(ObjectInputStream)的常用方法:

范例:对象序列化与反序列化

①. 定义一个Person类,实现Serializable接口

②. 序列化和反序列化Person类对象

运行如图所示:

三、serialVersionUID的作用

将对象序列化与反序列化范例中的serialVersionUID从Person类中去除,从新运行程序,结果会发现对象序列化成功、反序列化也成功了。现在添加一个属性address,如下:

然后执行反序列操作:

运行发现,会出现如下错误:

Exception in thread "main" java.io.InvalidClassException: com.pegasus.serializable.Person; local class incompatible: stream classdesc serialVersionUID = 2521373692768252888, local class serialVersionUID = -6354757228515182324

意思是,文件流中的class和修改过后的class,不兼容了,处于安全机制考虑,程序抛出错误,而且拒绝载入。如果我们真的需要在序列化后添加一个字段或者方法,应该怎么办?其实也很简单,只需自己去指定serialVersionUID即可。在上面的例子中,没有给Person类指定serialVersionUID,那么java编译器会自动给这个class生成一个serialVersionUID,只要对这个文件添加一个空格,得到的UID都会不同,这个编号是唯一的。所以,添加一个字段后,由于没有显示指定serialVersionUID,编译器又为我们生成一个UID,当然和前面保存在文件中的哪一个不一样,于是出现两个版本号不一致的错误。因此,只要自己指定serialVersionUID,就可在序列化以后,去添加一个字段,或者方法,而不会影响后期的反序列化,反序列后的对象还会多了方法和属性。

下面将Person类中指定serialVersionUID,重新执行序列化操作,将Person对象序列化到本地硬盘的Person.txt文件存储,然后修改Person类,之后再次反序列化测试,将会发现程序就没有异常了。

四、transient

当使用Serializable接口实现序列化操作时,如果一个对象中的某个属性不希望被序列化的话,则可以使用transient关键字进行声明。如下面的示例:

序列化、反序列化Customer,代码如下:

结果如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://blog.csdn.net/qq_25583079/article/details/48624425

Java对象序列化详解6,Java对象的序列化与反序列化详解相关推荐

  1. Java对象的序列化(Serialization)和反序列化详解

    ####1.序列化和反序列化 序列化(Serialization)是将对象的状态信息转化为可以存储或者传输的形式的过程,一般将一个对象存储到一个储存媒介,例如档案或记忆体缓冲等,在网络传输过程中,可以 ...

  2. 对象的序列化与反序列化详解

    [1] 序列化与反序列化 如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中,或者在网络传输 Java 对象,这些场景都需要用到序列化. 简单来说: 序列化:将数据结构或对象转换成二 ...

  3. java Serializable和Externalizable序列化反序列化详解--转

    一.什么是序列化?   "对象序列化"(Object Serialization)是 Java1.1就开始有的特性. 简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字 ...

  4. Java对象序列化文件追加对象的问题,以及Java的读取多个对象的问题解决方法。

    Java对象序列化文件追加对象的问题,以及Java的读取多个对象的问题解决方法. 参考文章: (1)Java对象序列化文件追加对象的问题,以及Java的读取多个对象的问题解决方法. (2)https: ...

  5. 【26天高效学习Java编程】Day22:Java中的属性集-缓冲流-转换流-序列化流详解

    本专栏将从基础开始,循序渐进,由浅入深讲解Java的基本使用,希望大家都能够从中有所收获,也请大家多多支持. 专栏地址:26天高效学习Java编程 相关软件地址:软件地址 所有代码地址:代码地址 如果 ...

  6. java io 对象_JAVA基础知识之IO——对象序列化

    对象序列化 Java对象序列化(Serialize)是指将Java对象写入IO流,反序列化(Deserilize)则是从IO流中恢复该Java对象. 对象序列化将程序运行时内存中的对象以字节码的方式保 ...

  7. Java序列化与反序列化详解

    面试官:兄弟,说说你对transient的理解和感悟 哪吒:what?还有感悟? 先说结论,在序列化.反序列化时,被transient关键字修饰的成员属性变量不会被序列化. 面试官:这就完了? 哪吒: ...

  8. Java序列化和反序列化(详解)

    一.理解Java序列化和反序列化 Serialization(序列化):将java对象以一连串的字节保存在磁盘文件中的过程,也可以说是保存java对象状态的过程.序列化可以将数据永久保存在磁盘上(通常 ...

  9. Java 序列化和反序列化详解完整版

    目录 一.序列化 1.1.Serialization(序列化): 1.2.deserialization(反序列化) 二.序列化和反序列化的应用 java序列化的优点: 三.序列化和反序列化地实现 3 ...

最新文章

  1. 不用IIS运行ASP.Net网站
  2. 总结H3CNE学习过程和其他
  3. 判断sem信号量为零_将信号量递减为零的进程崩溃时,如何恢复信号量?
  4. npm查找全局安装包命令
  5. 往mysql数据库中存当前日期_在MySQL数据库中存储日期的最简单方法是什么?
  6. 杭电1596find the safest road(spfa)
  7. jvm堆内存设置原理
  8. [求助] win7 x64 封装 出现 Administrator.xxxxx 的问题
  9. HTML怎么插入一段代码
  10. 转录组RNA-seq分析前沿进展综述
  11. 2022.3.21密码学des对称密码与rsa非对称密码【网络攻防CTF】(保姆级图文)
  12. 赛宁网安助力中国移动打造国内领先云安全能力
  13. Android JSON解析并展现在listactivity实例
  14. 企业进行固定资产盘点的作用
  15. [医学图像分割综述] Medical Image Segmentation Using Deep Learning: A Survey
  16. Java IO BIO NIO
  17. EC-PCA: 利润中心会计流程设计和方案要点
  18. Chef 环境的安装及使用
  19. 程序设计职工管理系统
  20. 电商类app商品详情参数选择联动的实现

热门文章

  1. 记一次 Kubernetes 集群被入侵,服务器变矿机
  2. 超强Redis数据类型与应用场景总结!!
  3. 百度大规模Service Mesh落地实践
  4. 干掉 ZooKeeper?阿里为什么不用 ZK 做服务发现?
  5. 咱们码农可以从曾国藩身上学到点什么呢?
  6. zabbix监控快速搭建--云平台技术栈10
  7. 扒一扒 JVM 的垃圾回收机制,拿大厂offer少不了它!
  8. 熬夜精心整理的一线大厂大数据、人工智能全套教程下载(含视频+源码)!!...
  9. 数字化时代,如何解决企业协同办公的问题?
  10. 浏览器事件监听的方法