Java 对象序列化

深碍√TFBOYSˉ_ 2023-07-03 02:33 239阅读 0赞

文章目录

  • 什么是序列化?
    • 举例:(定义一个可以被序列化的类)
  • 序列化与反序列化
    • 举例:(实现序列化与反序列化)
  • transient 关键字
    • 举例:(transient 关键字的使用)
    • 什么时候会使用到 transient 关键字?

几乎只要是 Java 开发就一定会存在有序列化的概念,而正是因为序列化的概念逐步发展,慢慢地也有了更多 的序列化标准

什么是序列化?

所谓的对象序列化指的是将内存中保存的对象以二进制数据流的形式进行处理,可以实现对象的保存或者是网络传输
在这里插入图片描述
然而并不是所有的对象都可以被序列化的,在 Java 里面有一个强制性的要求:如果要序列化的对象,那么对象所在的类一定要实现 java.io.Serializable 父接口,作为序列化的标记,这个接口并没有任何的方法,为什么?因为它描述的是一种类的能力

举例:(定义一个可以被序列化的类)

  1. class Person implements Serializable { // Person 类可以被序列化
  2. private String name;
  3. private int age;
  4. public Person(String name, int age) {
  5. this.name = name;
  6. this.age = age;
  7. }
  8. // 省略 setter getter
  9. @Override
  10. public String toString() {
  11. return "姓名:" + this.name + "、年龄:" + this.age;
  12. }
  13. }

此时 Person 类产生的每一个对象都可以实现二进制的数据传输,属于可以被序列化的程序类

序列化与反序列化

有了序列化的支持类之后如果想要实现序列化与反序列化的操作则就可以利用以下两个类完成:


























类名称 序列化:ObjecOutputStream 反序列化:ObjectInputStream
类定义 public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants
构造方法 public ObjectOutputStream(OutputStream out) throws IOException public ObjectInputStream(InputStream in) throws IOException
操作方法 public final void writeObject(Object obj) throws IOException public final Object readObject() throws IOException, ClassNotFoundException

举例:(实现序列化与反序列化)

  1. package com.java.springtest.testdemo;
  2. import java.io.*;
  3. /** * @author Woo_home * @create by 2020/1/31 */
  4. class Person implements Serializable { // Person 类可以被序列化
  5. private String name;
  6. private int age;
  7. public Person(String name, int age) {
  8. this.name = name;
  9. this.age = age;
  10. }
  11. // 省略 setter getter
  12. @Override
  13. public String toString() {
  14. return "姓名:" + this.name + " 年龄:" + this.age;
  15. }
  16. }
  17. public class Demo {
  18. private static final File SAVE_FILE = new File("D:" + File.separator + "demo.person");
  19. public static void saveObject(Object object) throws IOException {
  20. ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(SAVE_FILE));
  21. oos.writeObject(object); // 序列化
  22. oos.close();
  23. }
  24. public static Object loadObject() throws Exception {
  25. ObjectInputStream ois = new ObjectInputStream(new FileInputStream(SAVE_FILE));
  26. Object obj = ois.readObject(); // 反序列化
  27. ois.close();
  28. return obj;
  29. }
  30. public static void main(String[] args) throws Exception {
  31. saveObject(new Person("lisa",10));// 序列化
  32. System.out.println(loadObject()); // 反序列化
  33. }
  34. }

运行该程序之后会在 D 盘生成一个 demo.person 的文件
在这里插入图片描述
我们打开这个文件发现它存储的是一个二进制
在这里插入图片描述
控制台输出:
在这里插入图片描述
在 Java 中的对象序列化与反序列化必须使用内部提供的对象操作流,因为这里面牵扯到二进制数据的格式,所以不能自定义处理,另外如果想要实现一组对象的序列化,则可以使用对象数组完成

在很多的实际项目开发过程之中,开发者很少能够见到 ObjectOutputStream、ObjectInputStream 类的直接操作,因为会有一些容器帮助开发者自动实现

transient 关键字

默认情况下当执行了对象序列化的时候会将类中的全部属性的内容进行全部的序列化操作,但是很多情况下有一些属性可能并不需要进行序列化的处理,这个时候就可以在属性定义上使用 transient 关键字来完成了

  1. private transient String name;

如果在属性加上了 transient 关键字之后,那么在进行序列化处理的时候 name 属性的内容是不会被保存下来的,换言之,读取的数据 name 将是其对应数据类型的默认值(null)

举例:(transient 关键字的使用)

我们把上门的程序中的 name 属性加上 transient 关键字之后再执行一次,可以看到 name 输出为 null 了
在这里插入图片描述

什么时候会使用到 transient 关键字?

如果假设类之中有一些是需要计算保存的属性内容往往是不需要被序列化的,这个时候就可以使用 transient 关键字了,但是呢在实际上的开发之中大部分需要被序列化的类往往都是简单的 Java 类(比如 Java web 开发中的实体类),所以这一个关键字的出现频率并不高,但是得知道有这么一个关键字叫 transient

发表评论

表情:
评论列表 (有 0 条评论,239人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java序列对象

    java序列化 Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型

    相关 Java对象序列

    [Java对象序列化][Java]   当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个

    相关 Java 对象序列

    引言 将 [ Java][Java] 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列

    相关 Java对象序列

    Java对象的序列化 Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的

    相关 java对象序列

    概念: Java 提供了一种对象序列化的机制,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。将序列化对象写入文件