JAVA基础知识|Serializable
2024-08-27 05:51:02
一、序列化和反序列化
序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
将内存中对象的信息保存下来,可以有很多种方式实现这一功能。其中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工具根据类名、接口名、成员方法及属性等来生成);
最新文章
- ENode简介与各种教学视频资源汇总(要进群这篇文章必看)
- 解决phpMyAdmin“登录超时 (1440 秒未活动),请重新登录”的问题
- 不用逗号进行UNION
- Linux下C程序的编译,运行,及调试
- Android 自定义Toast
- (六)6.18 cnn 的反向传导算法
- winform 批量导入本地sql文件,批量导入mdb(access)文件到sqlserver
- socket本地模拟TCP 服务器+客户端(二)
- MongoDB基础教程系列--第六篇 MongoDB 索引
- Thinkphp3.2.3框架下封装公共的函数,例如封装CURL函数来获取接口数据
- QGIS2.18.0的精简编译
- PAT乙级-1056. 组合数的和(15)
- monkeyrunner简介
- 殊途同归 - Church-Rosser and Consistency of Evaluation
- javascript学习一、js的初步了解
- SaltStack 理解
- poj3164 最小树形图板子题
- bzoj 2301
- [LeetCode] 系统刷题3_Binary search
- 一、java虚拟机内存区域