没有合适的资源?快使用搜索试试~ 我知道了~
Java中序列化学习笔记/序列和反序列化的实现
需积分: 5 0 下载量 27 浏览量
2023-05-27
16:04:01
上传
评论
收藏 67KB DOCX 举报
温馨提示
试读
11页
java核心技术-序列化技术
资源推荐
资源详情
资源评论
1 为什么要序列化
文件需要在网络中传输,而网络中只接受二进制字节码文件。
序列化就是可以使数据形态发生变化的工具。
2 什么是序列化
序列化是将一个对象的状态(属性的值)保存起来,然后在适当的时候获得。
序列化分为两部分:序列化和反序列化。
序列化是这个过程的第一步,将数据分解成字节流,一般存储在文件中或在网络上传输。
反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,
于是还有恢复数据。恢复数据要求有恢复数据的对象实例。
2.1 序列化的本质
本质:流化,是一个过程,由 java 虚拟机完成,不由程序员完成。
2.2 对象流
能够输入和输出对象的流称为对象流,通过对象流可以将实现了 Serializable 接口的对象写
进内存、磁盘或网络介质中,此过程称为对象的序列化过程,也可以通过对象流将内存,磁
盘和网络中的字节流读入类的实例中,此过程称为对象的重构或反序列化。
对象的序列化仅仅只针对对象的实例变量值进行保存(不包含访问权限、变量类型、
和其他修饰符),所有的方法和静态变量将不会被序列化。
2.3 序列化实现
对象序列化要求对象实现序列化接口
public class Student implements Serializable{}
2.3.1 序列化
@Test
public void serialize() throws Exception{
try {
Student stu=new Student("1001","十一郎","男","30","安徽合肥","1001");
OutputStream os=new FileOutputStream("E:\1.txt");
//对象输出流
ObjectOutputStream oos=new ObjectOutputStream(os);
oos.writeObject(stu);
oos.flush();
oos.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
2.3.2 反序列化
@Test
public void deserialize(){
Student stu=null;
try {
InputStream is=new FileInputStream("E:\\1.txt");
ObjectInputStream oos=new ObjectInputStream(is);
stu=(Student)oos.readObject();
System.out.println(stu.getStu_name());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
3 序列化中常出现的问题
3.1 序列化 ID 的问题
private static final long serialVersionUID = -1384354585029029786L;
情景:两个平台使用序列化进行数据传输,反序列化是否成功不经取决于反序列化本身还取决于 serialVersionUID。
总结:
其实序列化的作用是能转化成 Byte 流,然后又能反序列化成原始的类。能在网络进行传输,也可以保存在磁盘中,有了 SUID
之后,那么如果序列化的类已经保存了在本地中,中途你更改了类后,SUID 变了,那么反序列化的时候就不会变成原始的类了,
还会抛异常,主要就是用于版本控制。
3.1.1 序列化特性使用案例:
外观模式:详见外观设计模式文档
Client 端通过 Façade Object 才可以与业务逻辑对象进行交互。而客户端的 Façade Object 不能直接由 Client 生成,而
是需要 Server 端生成,然后序列化后通过网络将二进制对象数据传给 Client,Client 负责反序列化得到 Façade 对象。
该模式可以使得 Client 端程序的使用需要服务器端的许可,同时 Client 端和服务器端的 Façade Object 类需要保持一致。
当服务器端想要进行版本更新时,只要将服务器端的 Façade Object 类的序列化 ID 再次生成,当 Client 端反序列化
Façade Object 就会失败,也就是强制 Client 端从服务器端获取最新程序。
3.2 静态变量的序列化
3.2.1 编程案例
public class Test implements Serializable {
private static final long serialVersionUID = 1L;
public static int staticVar = 5;
public static void main(String[] args) {
try {
//初始时 staticVar 为 5
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("result.obj"));
out.writeObject(new Test());
out.close();
//序列化后修改为 10
Test.staticVar = 10;
ObjectInputStream oin = new ObjectInputStream(new FileInputStream(
"result.obj"));
Test t = (Test) oin.readObject();
oin.close();
//再读取,通过 t.staticVar 打印新的值
System.out.println(t.staticVar);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
剩余10页未读,继续阅读
资源评论
雾林小妖
- 粉丝: 1w+
- 资源: 90
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- lda代码-checkpoint-checkpoint.ipynb
- 基于python开发的魂斗罗游戏+源码(毕业设计&课程设计&项目开发)
- 停车场管理系统系统采用JAVAEE,利用SQLSERVER2005,B/S架构
- 基于python开发的乒乓球和滑雪游戏+源码(毕业设计&课程设计&项目开发)
- 公司内部控制十大漏洞、五大原则、五大要素
- 2006-2021高管薪酬粘性数据:以业绩敏感性均值为基础,五年滚动计算
- 数独四六九宫格习题-四六九宫格数独题目-四六九宫格数独解答手册(600组)
- 【实务学习资料】python的Excel自动处理学习资料
- 2000-2020年全球194个国家双边贸易进口额出口额进出口总额
- 2003-2019全国各省地级市工业废水排放量城市废水排放量面板数据-Excel完整版
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功