文章插图
这篇文章主要给大家讲解序列化和反序列化 。
序列化是网络通信中非常重要的一个机制 , 好的序列化方式能够直接影响数据传输的性能 。
序列化所谓的序列化 , 就是把一个对象 , 转化为某种特定的形式 , 然后以数据流的方式传输 。
比如把一个对象直接转化为二进制数据流进行传输 。当然这个对象可以转化为其他形式之后再转化为数据流 。
比如XML、JSON等格式 。它们通过另外一种数据格式表达了一个对象的状态 , 然后再把这些数据转化为二进制数据流进行网络传输 。
反序列化反序列化是序列化的逆向过程 , 把字节数组反序列化为对象 , 把字节序列恢复为对象的过程成为对象的反序列化
序列化的高阶认识前面的代码中演示了 , 如何通过JDK提供了Java对象的序列化方式实现对象序列化传输 , 主要通过输出流java.io.ObjectOutputStream和对象输入流java.io.ObjectInputStream来实现 。
java.io.ObjectOutputStream:表示对象输出流 , 它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化 , 把得到的字节序列写到一个目标输出流中 。
java.io.ObjectInputStream:表示对象输入流 ,它的readObject()方法源输入流中读取字节序列 , 再把它们反序列化成为一个对象 , 并将其返回
需要注意的是 , 被序列化的对象需要实现java.io.Serializable接口
serialVersionUID的作用在IDEA中通过如下设置可以生成serializeID , 如图5-1所示
字面意思上是序列化的版本号 , 凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量 。

文章插图
图5-1下面演示一下serialVersionUID的作用 。首先需要创建一个普通的spring boot项目 , 然后按照下面的步骤来进行演示
创建User对象
public class User implements Serializable {private static final long serialVersionUID = -8826770719841981391L;private String name;private int age;}编写Java序列化的代码public class JavaSerializer {public static void main(String[] args) {User user=new User();user.setAge(18);user.setName("Mic");serialToFile(user);System.out.println("序列化成功 , 开始反序列化");User nuser=deserialFromFile();System.out.println(nuser);}private static void serialToFile(User user){try {ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream(new File("user")));objectOutputStream.writeObject(user);} catch (IOException e) {e.printStackTrace();}}private static <T> T deserialFromFile(){try {ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream(new File("user")));return (T)objectInputStream.readObject();} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}return null;}}UID验证演示步骤- 先将user对象序列化到文件中
- 然后修改user对象 , 增加serialVersionUID字段
- 然后通过反序列化来把对象提取出来
- 演示预期结果:提示无法反序列化
从结果可以看出 , 文件流中的class和classpath中的class , 也就是修改过后的class , 不兼容了 , 出于安全机制考虑 , 程序抛出了错误 , 并且拒绝载入 。从错误结果来看 , 如果没有为指定的class配置serialVersionUID , 那么java编译器会自动给这个class进行一个摘要算法 , 类似于指纹算法 , 只要这个文件有任何改动 , 得到的UID就会截然不同的 , 可以保证在这么多类中 , 这个编号是唯一的 。所以 , 由于没有显指定 serialVersionUID , 编译器又为我们生成了一个UID , 当然和前面保存在文件中的那个不会一样了 , 于是就出现了2个序列化版本号不一致的错误 。因此 , 只要我们自己指定了serialVersionUID , 就可以在序列化后 , 去添加一个字段 , 或者方法 , 而不会影响到后期的还原 , 还原后的对象照样可以使用 , 而且还多了方法或者属性可以用 。
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
