序列化就是将对象转化为字符序列的过程反序列化就是将字符序列转化为对象的过程 为什么要序列化
在两个进程通信过程中会传输文字、音频、图片各种类型的数据,这些数据都是以二进制序列在网络间传输。当然对象也是可以通过此方法实现,这便用到了序列化与反序列化。
一方面发送方将对象序列化,在网络上传输,接收方可通过反序列化得到原始的对象数据。很好的实现了数据的持久化,可以将对象的字符序列存储在硬盘中,通常放在一个文件中。
另一方面利用序列化实现远程通信,即字符序列在网络间传输
将对象的字符序列存储在硬盘中,通常放在一个文件中在网络传输的过程中,传送对象的字符序列 涉及的JAVA APi
java.io.ObjectOutputStream //表示对象输出流 writeObject(Object obj) //可以参数指定的obj对象进行序列化,把得到的字符序列写到一个目标输出流 java.io.ObjectInputStream //表示对象输入流 readObject() //可以把输入流读为字符序列,再通过反序列化转化为对象使用步骤
// 假设定义了一个对象
Animal animal = new Animal();
animal.setName("老虎");
animal.setAge(9);
// 创建输出流指定目标地址
ObjectOutputStream out = new ObjOutputStream(new FileOutputStream('目标文件地址'));
// 序列化
out.writeObject(animal);
// 创建输入指定目标地址
ObjectInputStream out = new ObjectInputStream(new FileOutputStream('目标文件地址'));
// 反序列化
Animal animal = (Animal)out.readObject();
序列化ID的作用
序列化ID是用于标识唯一性,它决定着是否能够成功反序列化。便是说java的序列化机制便是判断该类的序列化ID serialVersionUID是否一致即版本是否相同。在反序列化的过程中,JVM会将传来的字节流中的serialVersionUID与本地类中的serialVersionUID进行判断一致性,若一致则可进行反序列化操作,否则便会产生版本不一致的异常。
序列化ID的使用在本地类中定义一个名为“serialVersionUID”,long类型的变量即值保持不变,这样在之后需要改变需求时便可很好的进行修改。
若未设置,在对class编译时会自动生成一个serialVersionUID,这样随着需求的改动,进行添加其他字段后,在反序列化时会产生版本不一致。
在使用序列化机制时可以实现Serializable接口、Externalizable接口
在使用Serializable接口时,使用transient关键字可以不被序列化在使用Externalizable接口,需要我们自己指定那些属性是需要序列化的,即使使用transient关键字
注:静态变量不管是不是transient关键字修饰,都不会被序列化
总结
java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中
经过个人总结
参考原文:
1. https://baijiahao.baidu.com/s?id=1636557218432721275&wfr=spider&for=pc 2. https://www.cnblogs.com/lukelook/p/11192677.html



