一、概念

当两个进程远程通信时,彼此可以发送各种类型的数据。 无论是何种类型的数据,都会以二进制序列的形式在网络上传送。比如,我们可以通过 http 协议发送字符串信息;我们也可以在网络上直接发送 Java 对象。发送方需要把这个 Java 对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为 Java 对象才能正常读取。把 Java 对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为 Java 对象的过程称为对象的反序列化。

对象序列化的作用有如下两种:

  1. 持久化: 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中,比如:休眠的实现。以后服务器 session 管理,hibernate 将对象持久化实现。
  2. 网络通信:在网络上传送对象的字节序列。比如:服务器之间的数据通信、对象传递。

序列化和反序列化要素:

1、序列化能保存的元素

a) 只能保存对象的非静态成员变量

b) 不能保存任何成员方法和静态的成员变量

c) 不保存 transient 修饰的成员变量

d) 如果一个对象的成员变量是一个对象,这个对象的成员变量也会保存

e) 序列化保存的只是变量的值,对于变量的任何修饰符不能保存

2、使用对象流把一个对象写到文件时不仅保证该对象是序列化的,而且该对象的成员对象也必须是可序列化的。

3、如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个 NotSerializableException 异常。我们可以将这个引用标记为 transient,那么对象仍然可以序列化。

二、对象序列化注意事项

1、同一个对象多次序列化的处理

a) 所有保存到磁盘中的对象都有一个序列化编号

b) 序列化一个对象中,首先检查该对象是否已经序列化过

c) 如果没有,进行序列化

d) 如果已经序列化,将不再重新序列化,而是输出编号即可

2、如果不希望某些属性(敏感)序列化,或不希望出现递归序列

a) 为属性添加 transient 关键字(完成排除在序列化之外)

b) 自定义序列化(不仅可以决定哪些属性不参与序列化, 还可以定义属性具体如何序列化)

3、序列化版本不兼容

a) 修改了实例属性后,会影响版本号,从而导致反序列化不成功

b) 解决方案:为 Java 对象指定序列化版本号 serialVersionUID。为了防止读和写的序列化 ID 不一致,一般指定一个固定的序列化 ID。

序列化ID的作用:
其实,这个序列化 ID 起着关键的作用,它决定着是否能够成功反序列化!简单来说,java 的序列化机制是通过在运行时判断类的 serialVersionUID 来验证版本一致性的。在进行反序列化时,JVM 会把传来的字节流中的 serialVersionUID 与本地实体类中的 serialVersionUID 进行比较,如果相同则认为是一致的,便可以进行反序列化,否则就会报序列化版本不一致的异常。

三、序列化和反序列化案例

将 Student 类的实例进行序列化和反序列化:

Student 类:

public class Student implements Serializable{private static final long serialVersionUID = 2582122878311435520L;private String name;private int age;public static String schoolName;private transient String pwd;//属性值将不再被序列化public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}public Student(String name, int age, String pwd) {this.name = name;this.age = age;this.pwd = pwd;}public Student() {}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + ", pwd=" + pwd + ", schoolName=" + schoolName + "]";}
}

测试 Student 类:

public class TestStudent {public static void main(String[] args) {//      write();read();}public static void write() {ObjectOutputStream oos = null;try {oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("E:/student.txt")));Student stu = new Student("Jack", 22, "888888");Student.schoolName = "北清大学";oos.writeObject(stu);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {try {if(oos != null)oos.close();} catch (IOException e) {e.printStackTrace();}}}public static void read() {ObjectInputStream ois = null;try {ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("E:/student.txt")));Student stu = (Student) ois.readObject();System.out.println(stu);} catch (FileNotFoundException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {try {if(ois != null)ois.close();} catch (IOException e) {e.printStackTrace();}}}
}

运行结果:

注意:一定要写运行 write() 方法,将 write() 方法注释掉再运行 read() 方法,否则反序列化会读取到静态变量 schoolName 的值!!!

传递实体类对象_Java I/O 流之对象流中的序列化和反序列化相关推荐

  1. fileinputstream自定义类序列化和反序列化_Rest Assured篇:Java中的序列化和反序列化...

    点击上方蓝字设为星标 每天傍晚伴你一起成长! Java 中的序列化和反序列化是一个重要的编程概念.它适用于所有主要的编程语言.在本章中,我们将尝试在Java语言的上下文中理解此概念.在本章的最后,我们 ...

  2. java实体类设计_java实验1 实体类的设计-答案

    实验一实体类设计 一.实验时间:姓名:学号: 二.实验目的 1.掌握Java的类结构: 2.掌握实体类的作用: 3.能够对相似对象的共同属性进行抽象: 4.掌握对成员变量的赋值和取值函数编写: 5.理 ...

  3. 实体类 接口_Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口)

    原文:Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口, 视频讲解) 这里分享三道编程题, 下面是我个人的视频讲解 二维数组, 五子棋游戏, 实体类和接口_哔哩哔哩 (゜-゜)つロ ...

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

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

  5. java自定义上下文对象_Java框架_Spring应用上下文对象加载配置

    我们都知道IOC是spring框架的核心,主要作用是控制反转,把我们需要的对象从容器中提供给我们,但是IOC是如何加载我们所需要的对象的? Spring容器是IOC容器的一种,它通过Applicati ...

  6. java序列化和反序列化对象_java中的序列化与反序列化,还包括将多个对象序列化到一个文件中...

    package Serialize; /** * Created by hu on 2015/11/7. */ //实现序列化必须实现的接口,这就是一个空接口,起到标识的作用 import java. ...

  7. java声明对象_Java中类的声明与对象创建

    类是一个模板,它描述一类对象的行为和状态:对象是类的一个具体的实例,由类构造对象的过程称为创建类的实例.如:路灯是一个类,每一个路灯就是该类的对象. 1.类声明 类声明格式 [public] [abs ...

  8. java 不能反序列化_java中的序列化与反序列化

    序列化就是将一个对象以及他的属性写入一个文件,保存在存中对象的状态 反序列化就是把保存的对象状态再读出来 实现序列化与反序列化就要使用到IO操作中文件的字节流输入与输出 inputStream与out ...

  9. python的文件流,初步网页爬虫,序列化和反序列化

    一.文件流 1.  open方法是打开文件,方法是: open("文件名",'打开方式','缓存'') 参数说明: "文件名":包含了你要访问的文件路径及文件名 ...

最新文章

  1. ADO.NET的连接模式
  2. Eclipse中dropins干什么用的文件夹啊?
  3. 台湾大学林轩田机器学习技法课程学习笔记3 -- Kernel Support Vector Machine
  4. sql limit 的用法
  5. 未来十大技能职场吃香
  6. power iso linux启动盘,Power ISO Maker/ISO燃烧到磁盘工具 V3.0版
  7. MVC 中 注册不成功 或其他操作不成功 提示办法
  8. libiconv字符集转换库在C#中的使用
  9. 蚂蚁金服:超大规模分布式计算系统 + 超大规模分布式优化算法
  10. 手写token解析器、语法解析器、LLVM IR生成器(GO语言)
  11. matlab 图像分块及恢复
  12. 导出无法正常启动的VMware虚拟机中的文件
  13. VS2017社区版安装
  14. 树莓派4 PWM控制风扇转速
  15. 施一公:无论什么学科,最不重要的就是智商
  16. matlab 纵坐标变为百分比形势,“怎么把excel纵坐标改为百分数类型“excel中如何求百分比...
  17. 手机浏览器下载IOS版APP
  18. Nature Microbiology | 可感染阿斯加德古菌的六种深海沉积物中的病毒基因组
  19. java导出excel带上进度条_导出数据至Excel前台js进度条不能隐藏
  20. 系统思考正反馈之马太效应

热门文章

  1. 【毕业设计】jsp+sql毕业生招聘系统毕业设计(系统+论文+英文文献+综合材料)
  2. 【论文写作】毕业论文写作套路之正文(2)
  3. 计算机专业虽然好,但是也要有这些潜质才去选择
  4. 结束下面sql块_oracle: PL/SQL基本结构,语法,变量
  5. 计算机一级笔试2012,2012计算机一级笔试模拟试卷及答案
  6. Activiti工作流从入门到入土:完整Hello World大比拼(Activiti工作流 API结合实例讲解)...
  7. 速度极大提升,Arch Linux 计划将 zstd 作为默认压缩算法
  8. [2019.1.2]BZOJ2115 [Wc2011] Xor
  9. Lisp的永恒之道(转)
  10. centos gradle 安装