写点什么

Java 篇 - 序列化与反序列化

作者:是老郭啊
  • 2022 年 4 月 19 日
  • 本文字数:1023 字

    阅读完需:约 3 分钟

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


  • 序列化:将对象转化为字节序列的过程。

  • 反序列化:将字节序列转化为对象的过程。


二、为什么要序列化与反序列化


  1. 持久化:方便数据进行永久持久化,当 JVM 停止或者集群当中,仍然可以通过反序列化转化成对象。

  2. 网络传输:对象无法直接通过网络传输,因此只能先序列化成数据,典型的例子是 dubbo 的 rcp 传输必须要求传输对象是满足序列化与反序列化。


三、怎么实现序列化与反序列化


  1. 序列化的对象需要实现 Serializable 接口或者 Externalizable 接口

  2. JDK 提供的 ObjectOutputStream 和 ObjectInputStream 来实现序列化和反序列化


// 序列化public static void main(String[] args) {    TextBean textBean = new TextBean();    textBean.setDate(new Date());    textBean.setId(1);    textBean.setName("zll1");
try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("D:\\externalizable.txt"))) { outputStream.writeObject(textBean); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }}
// 反序列化public static void main(String[] args) { try (ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\\externalizable.txt"))) { TextBean textBean = (TextBean) objectInputStream.readObject(); System.out.println(textBean); //输出结果:TextBean{id=1, name='zll1', date=Fri Nov 27 16:49:17 CST 2020} } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }}
复制代码


四、serialVersionUID 作用


serialVersionUID 是 Java 为每个序列化类产生的版本标识,可用来保证在反序列化时,发送方和接收方的对象是可兼容的。如果接收方接收的类的 serialVersionUID 与发送方发送的 serialVersionUID 不一致,进行反序列时会抛出 InvalidClassException。所以,为了保证在不同的 jdk 编译实现中,其 serialVersionUID 的值也一致,可序列化的类必须显式指定 serialVersionUID 的值。另外,serialVersionUID 的修饰符最好是 private,因为 serialVersionUID 不能被继承,所以建议使用 private 修饰 serialVersionUID。

用户头像

是老郭啊

关注

一位头发日渐稀疏的 90后 IT男 2020.04.07 加入

当你焦虑大于努力时,你将沦为焦虑本身。

评论

发布
暂无评论
Java篇-序列化与反序列化_Java_是老郭啊_InfoQ写作社区