网站首页 > java教程 正文
Java对象在JVM运行的时候被创建、更新以及销毁,在JVM退出的时候,对象也会随之销毁,也就是说这些对象的整个的生命周期不会比JVM的生命周期更长。在实际应用中,有这样的一个操作,就是需要对象以及其状态在多个应用之间进行传递、共享,在有些时候需要对对象以及其状态进行持久化操作,然后在其他的应用场景中被读取对其状态进行继续处理操作。这就是Java的序列化的机制所要解决的问题。
在Java中使用序列化的技术对于对象以及其状态信息进行保存的时候,对象的状态信息会被保存到一组的字节数组中,在使用的时候将这些字节数组通过反序列化的方式,转换成对象。但这里需要注意的一点是,对象序列化的时候保存的是对象的状态,,所以对于静态变量的话则不会被序列化。
这种序列化的方式在远程过程调用RPC或者是通过网络传输对象中经常被使用,现在比较流行的RPC框架有Dubbo、DubboX等等。
Java序列化
Java中的序列化API提供了对于对象的序列化的一套标准的机制。在使用的过程中需要注意以下的一些问题。
- 1、类需要实现序列化的功能,只需要实现Serialiable接口。
- 2、序列化和反序列化需要保持序列化ID的一致性,在Eclipse中通过 serialVersionUID定义序列化ID。
- 3、序列化操作并不会保存静态变量
- 4、在需要序列化父类的变量的时候,父类也需要实现Serialiable接口
- 5、在使用到transient关键字的时候可以使得这个变量不会被序列化,在反序列之后,transient变量的值也会被设置对应的数据类型的初始值。
public class Worker implement Serializable{
//定义一个序列化ID
private static final long serialVersionUID = 12312312L;
// name 将会被序列化
private String name;
private transient int salary;
static int age =12;
public String getName(){
}
public void setName(String name){
}
}
通过继承了Serializable实现了一个序列化的类,需要注意的一点是之前说过的被transient修饰的属性了static关键字修饰的属性是不会被序列化。
对象在经过了序列化操作之后,进行网络传输操作,这就有网络安全的问题,也就是说需要在序列化的时候对于有些敏感信息进行加密,反序列化之后,基于对应的解密方式对于数据进行解密操作,这样在整个的网络操作上可以保证数据传输过程中的安全性。
反序列化
Java生态中有很多的框架都是提供了序列化功能,例如我们常用的FastJSON。当然也可以基于JDK原生的ObjectOutputStream和ObjectInputStream类实现对象序列化和反序列化的操作。并且调用其中的writeObject和readObject方法实现对于自己定义的序列化策略。
public static void main(String[] args){
//序列化
FileOutputStream fos = new FileOutputStream("worker.out");
ObjectOutputStream oos = new ObjectOutStream(fos);
Woker testObject = new Worker();
testObject.setName("alex");
oos.writeObject(testObject);
oos.flush();
oos.close();
// 反序列化磁盘数据并且解析数据状态信息
FileInputStream fis = new FileInputStream("worker.out");
ObjectInputStream ois = new ObjectInputStream(fis);
Worker deTest = (Worker)ois.readObject();
System.out.println(deTest.getName());
}
猜你喜欢
- 2024-10-08 Java核心知识 基础六 JAVA序列化(创建可复用的Java对象)
- 2024-10-08 java中的序列化(JAVA中的序列化)
- 2024-10-08 Java 面试题之 序列化和反序列化的深入理解
- 2024-10-08 Oracle:Java 的序列化就是个错误,我们要删掉它!
- 2024-10-08 java序列化和反序列化实例详解(java序列化和反序列化实例详解区别)
- 2024-10-08 java对象序列化(java对象序列化到文件)
- 2024-10-08 实战案例:轻松搞定Java两种序列化机制
- 2024-10-08 java序列化机制之protobuf(快速高效跨语言)
- 2024-10-08 Java路径-40-Java序列化(未检测到java sdk环境请在配置中添加sdk安装路径)
- 2024-10-08 java序列化知多少(java序列化怎么实现)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)