一、序列化和反序列化

序列化:把对象转换为字节序列的过程称为对象的序列化。

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

将内存中对象的信息保存下来,可以有很多种方式实现这一功能。其中java提供了一种更好的保存对象状态的机制,那就是序列化。

应用场景:

  • 把内存中的对象状态保存到一个文件或者数据库中的时候;
  • 在网络上传送对象的时候;
  • 其他(以后再补充)

二、实例

import java.io.Serializable;

/**
* Created by jyy on 2018/6/4.
*/
public class Cat implements Serializable { public Cat(String id, String name) {
this.id = id;
this.name = name;
} private String id;
private String name;
public static String call = "喵喵喵"; public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "Cat{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", call='" + call + '\'' +
'}';
}
}
import java.io.*;

/**
* Created by jyy on 2018/4/19.
*/
public class Test { public static void main(String[] args){ Cat cat = new Cat("1001","Tom");
serialize(cat);
deserialize(); Cat.call = "喵";
deserialize();
} /**
* 序列化
*/
public static void serialize(Cat cat){ ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream(new File("D:/other/cat.txt")));
oos.writeObject(cat);
System.out.println("序列化成功:"+cat);
}catch(IOException e){
System.out.println("Cat 对象序列化失败!");
}finally{
try {
oos.close();
}catch(IOException e){
System.out.println("输出流关闭失败!");
}
}
} /**
* 反序列化
*/
public static void deserialize(){ ObjectInputStream ois;
try {
ois = new ObjectInputStream(new FileInputStream(new File("D:/other/cat.txt")));
Cat cat1 = (Cat)ois.readObject();
System.out.println("反序列化成功:"+cat1);
}catch (Exception e){
System.out.println("Cat 对象反序列化失败!");
}
}
}

执行结果:

序列化成功:Cat{id='1001', name='Tom', call='喵喵喵'}
反序列化成功:Cat{id='1001', name='Tom', call='喵喵喵'}
反序列化成功:Cat{id='1001', name='Tom', call='喵'}

对象中非静态的成员变量“id”,“name”可以被序列化。但是静态成员变量“call”,不可以被序列化,因为它是属于类信息的一部分,而不属于对象。

如果某一成员变量不想被序列化,可以使用关键字“transient”进行修饰。

三、serialVersionUID

将序列化后的对象进行网络传输时,serialVersionUID将必不可少。

例如在客户端A中Cat类的serialVersionUID=1L,而在客户端B中Cat类的serialVersionUID=2L,那么就不能反序列化这个对象。

serialVersionUID有两种生成策略:

  • 一个是固定的 1L;
  • 一个是随机生成不重复的 long 类型数据(实际上是使用JDK工具根据类名、接口名、成员方法及属性等来生成);

最新文章

  1. ENode简介与各种教学视频资源汇总(要进群这篇文章必看)
  2. 解决phpMyAdmin“登录超时 (1440 秒未活动),请重新登录”的问题
  3. 不用逗号进行UNION
  4. Linux下C程序的编译,运行,及调试
  5. Android 自定义Toast
  6. (六)6.18 cnn 的反向传导算法
  7. winform 批量导入本地sql文件,批量导入mdb(access)文件到sqlserver
  8. socket本地模拟TCP 服务器+客户端(二)
  9. MongoDB基础教程系列--第六篇 MongoDB 索引
  10. Thinkphp3.2.3框架下封装公共的函数,例如封装CURL函数来获取接口数据
  11. QGIS2.18.0的精简编译
  12. PAT乙级-1056. 组合数的和(15)
  13. monkeyrunner简介
  14. 殊途同归 - Church-Rosser and Consistency of Evaluation
  15. javascript学习一、js的初步了解
  16. SaltStack 理解
  17. poj3164 最小树形图板子题
  18. bzoj 2301
  19. [LeetCode] 系统刷题3_Binary search
  20. 一、java虚拟机内存区域

热门文章

  1. 用ajax和PHP实现简单的流程管理
  2. sql server动态分页
  3. nodejs库express是如何接收inbound json请求的
  4. 【OF框架】在Azure DevOps中配置项目持续集成CI服务,推送镜像到Azure容器注册表
  5. zookeeper服务【-】windows安装与liunx安装
  6. Luogu P5020 货币系统
  7. 【二叉搜索树】PAT-天梯赛- L2-004. 这是二叉搜索树吗?
  8. 网站添加logo图片
  9. JavaScript 廖2
  10. vue 传入一个对象的所有属性