当前位置: 首页 > article >正文

Java面试篇基础部分-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());
}

http://www.kler.cn/news/303230.html

相关文章:

  • 高性能缓存利器:Caffeine 在 Spring Boot 中的应用
  • 快速完成论文初稿写作的ChatGPT提示词分享
  • 怎样将vue项目 部署在ngixn的子目录下
  • linux环境下手动安装mysql
  • holynix靶机详解
  • PROTOTYPICAL II - The Practice of FPGA Prototyping for SoC Design
  • 【ShuQiHere】快速排序(Quick Sort):揭开高效排序算法的神秘面纱
  • 观察者模式observer
  • pdf 转 jpg
  • 黑马点评15——分布式缓存-Redis分片集群
  • C文件操作
  • Sentinel 使用案例详细教程
  • K8S - Volume - NFS 卷的简介和使用
  • SpringBoot - 入门
  • 【WPF】Popup的使用
  • IO中断原理浅析
  • 分销系统架构文档
  • OpenGL(三)着色器语言GLSL
  • 深度学习速通系列:依存分析
  • 了解计算机安全性【技术、管理与法律】
  • 如何用 OBProxy 实现 OceanBase 的最佳路由策略
  • 算法类学习笔记 ———— 障碍物检测
  • 如何使用Visual Studio的内存诊断工具进行内存泄漏检测
  • 今年的智能手机不仅仅是AI
  • 区块链领航者孙宇晨:驾驭潮流,共绘未来新篇章
  • 基于Spark 的零售交易数据挖掘分析与可视化
  • Java | Leetcode Java题解之第403题青蛙过河
  • mysql一主2从部署
  • 记者协会评审系统-需求分析
  • 苹果CMS vs. 海洋CMS:哪个系统更易于百度收录?