转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10857597.html

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

 

一:什么是序列化与反序列化

  序列化:对象序列化是指将Java对象(动态的状态,如变量、函数)转换为字节流的过程,可以将其保存到磁盘文件中或通过网络发送到任何其他程序。

  反序列化:从字节流重构出Java对象的过程。

  序列化得到的字节流是与平台无关的,在一个平台上序列化的对象可以在不同的平台上反序列化。

 

二:序列化的作用

  1)对象持久化

  我们知道,对象随着程序的运行而被创建,然后在不可达时被回收,生命周期是短暂的。但是如果我们想长久地把对象的内容保存起来怎么办呢?把它转化为字节序列保存在存储介质上即可。那就需要序列化。

  2)网络传输对象

  我们知道,两个进程之间通信时,传递的音频、视频等信息是以二进制序列形式来传输的。那么,对象也可以吗?可以,通过序列化把主机A进程上的对象序列化为二进制序列,传输到主机B上的进程从序列中重构出该对象。这在RMI中应用广泛,RMI的结果可以是一个对象。

 

三:如何序列化

  1、让类对象可以被序列化

  1)默认序列化方式

  定义类时实现Serializable接口即可,这个Serializable接口是一个空接口,没有需要实现的方法。

  作用是标记该类的对象可以被序列化,启用其序列化功能。通过调用 ObjectOutputStream和ObjectInputStream的方法来即可对该对象进行序列化和反序列化。

 

  2)自定义类的序列化与反序列化接口:

  定义类时,实现Serializable接口,并在类中重写两个序列化与反序列化接口,在其中定义对象序列化与反序列化动作。

private void writeObject(java.io.ObjectOutputStream out)
     throws IOException

private void readObject(java.io.ObjectInputStream in)
     throws IOException, ClassNotFoundException;
   

  这两个方法,在方法中通过对象输入流参数、对象输出流参数进行自定义的内容输出。

  这样通过 ObjectOutputStream和ObjectInputStream 序列化和反序列化对象时会自动调用类中定义的writeObject、和readObject方法而不是默认的序列化和反序列化方法。

 

  2、序列化与反序列化API与使用过程

 

四:序列化底层原理

 

五:序列化的特殊情况 

 

六:序列化破坏单例模式

 

七:为什么说序列化并不安全

 

八:protobuf协议

 

九:其他序列化方式

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄