J2SE中的序列化之继承

J2SE中的序列化是将对象转换成字节流,用于对象的存储和传输。而在序列化对象时,如果该对象实现了Serializable接口,那么子类也会自动实现序列化,这就是所谓的“继承序列化”。

下面通过示例说明继承序列化的几个要点:

1.子类序列化时父类属性的序列化与反序列化:

public class Parent implements Serializable{
    private static final long serialVersionUID = 1L;
    private int parentId;
    public Parent(int parentId) {
        this.parentId = parentId;
    }
    public int getParentId() {
        return parentId;
    }
    public void setParentId(int parentId) {
        this.parentId = parentId;
    }
}

public class Child extends Parent {
    private static final long serialVersionUID = 1L;
    private int childId;
    public Child(int parentId, int childId) {
        super(parentId);
        this.childId = childId;
    }
    public int getChildId() {
        return childId;
    }
    public void setChildId(int childId) {
        this.childId = childId;
    }
}

public static void main(String[] args) throws Exception {
    FileOutputStream fos = new FileOutputStream("serial.txt");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    Child child = new Child(100, 200);
    oos.writeObject(child);
    oos.close();
    fos.close();

    FileInputStream fis = new FileInputStream("serial.txt");
    ObjectInputStream ois = new ObjectInputStream(fis);
    Child newChild = (Child) ois.readObject();
    System.out.println(newChild.getParentId());
    System.out.println(newChild.getChildId());
    ois.close();
    fis.close();
}

在父类属性没有实现Serializable接口时,子类序列化时,父类属性不会被序列化和反序列化,因此在输出结果中只能得到子类的属性值。

2.子类实现自己的readObject与writeObject:

public class Child extends Parent {
    private static final long serialVersionUID = 1L;
    private int childId;
    public Child(int parentId, int childId) {
        super(parentId);
        this.childId = childId;
    }
    public int getChildId() {
        return childId;
    }
    public void setChildId(int childId) {
        this.childId = childId;
    }
    private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        out.writeInt(getParentId());
    }
    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        setParentId(in.readInt());
    }
}

public static void main(String[] args) throws Exception {
    FileOutputStream fos = new FileOutputStream("serial.txt");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    Child child = new Child(100, 200);
    oos.writeObject(child);
    oos.close();
    fos.close();

    FileInputStream fis = new FileInputStream("serial.txt");
    ObjectInputStream ois = new ObjectInputStream(fis);
    Child newChild = (Child) ois.readObject();
    System.out.println(newChild.getParentId());
    System.out.println(newChild.getChildId());
    ois.close();
    fis.close();
}

我们在Child类中添加了自己的writeObject和readObject方法,序列化时只需要序列化子类的属性,而在反序列化时,我们显式地从输入流中读取并设置父类的属性值,这样就能够正确地反序列化子类。

综上,了解继承序列化可以让我们更好地掌握Java的序列化机制,避免一些问题的出现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:J2SE中的序列化之继承 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • Hibernate管理Session和批量操作分析

    我将为您详细讲解“Hibernate管理Session和批量操作分析”的完整攻略。 什么是Hibernate Hibernate是一种Java持久层框架,它可以帮助我们简化与关系型数据库的交互。它将Java对象映射到数据库表,并提供了一种自动化和简化的方式来对数据进行CRUD操作。 Hibernate中的Session 在Hibernate中,Session…

    Java 2023年5月20日
    00
  • C#实现简单打字小游戏

    C#实现简单打字小游戏攻略 思路分析 实现打字游戏需要以下步骤: 随机生成单词:从一个单词列表中选择一个单词,或者生成一个随机单词; 显示单词并记录开始时间; 接收用户输入并计算打字速度; 将结果显示出来; 示例1:从单词列表中选择一个单词 首先定义一个单词列表: string[] words = { "hello", "wor…

    Java 2023年5月19日
    00
  • 垃圾回收的作用是什么?

    以下是关于垃圾回收的作用的完整使用攻略: 垃圾回收的作用 垃圾回收是一种自动化的内存管理方式,它的作用在程序运行过程中,自动回收不再使用的内存空间,从而避免内存泄漏和内存溢出。垃圾收可以减少程序员的工作量,提高程序的可靠性和安全性。 以下是两个示例说明垃圾回收的作用 1. 避免内存泄漏 存泄漏是指程序在运行过程中,分配的内存空间没有及时释放,致内存空间的浪费…

    Java 2023年5月12日
    00
  • java 字符串截取的三种方法(推荐)

    下面我会详细讲解Java字符串截取的三种方法(推荐)。 Java字符串截取的三种方法(推荐) 在Java中,字符串是一个很常见的数据类型。而在字符串的处理中,字符串截取也是很常见的需求之一。本攻略主要介绍Java字符串截取的三种方法(推荐)。 方法一:substring() 方法 substring() 方法是一种常见的字符串截取方法。它可以根据给定的起始和…

    Java 2023年5月26日
    00
  • Java 泛型总结(二):泛型与数组

    Java 泛型总结(二):泛型与数组 在 Java 中,泛型和数组是两个不同的概念,但它们之间的关系比较微妙,需要仔细理解。本篇文章将讲解 Java 泛型和数组的关系,旨在帮助读者更深入理解 Java 泛型的本质。 泛型与数组的不同 泛型是编译期检查的,而数组是运行期检查的。这意味着,我们可以编写泛型代码来确保模板类型的安全性,一旦编译通过,就可以放心使用。…

    Java 2023年5月26日
    00
  • 分析JVM源码之Thread.interrupt系统级别线程打断

    分析JVM源码之Thread.interrupt系统级别线程打断 在JVM中,线程是一个非常重要的概念。而线程的打断对于线程的控制也非常重要。Java语言中提供了很多打断线程的方法,其中Thread.interrupt()方法就是其中一种。Thread.interrupt()方法用于中断线程并抛出InterruptedException。在本文中,我们将会介…

    Java 2023年5月24日
    00
  • 纯java代码实现抽奖系统

    纯Java代码实现抽奖系统需要考虑以下几个方面: 随机生成中奖号码 用户输入信息并提交抽奖请求 判断用户是否中奖并发送中奖信息 接下来我会详细讲解每个方面的实现。 随机生成中奖号码 要实现抽奖系统首先需要生成中奖号码,可以使用Java中的Random类来实现。以下是一个示例代码: import java.util.Random; public class L…

    Java 2023年5月19日
    00
  • mybatis-plus主键生成策略

    mybatis-plus主键生成策略可以通过注解或配置文件进行设置,下面将详细讲解。 1. 注解方式设置主键生成策略 在实体类中使用@TableId注解可以设置主键生成方式。其属性type表示主键生成类型,取值范围为枚举类IdType中的枚举值,包括AUTO、NONE、INPUT、ID_WORKER、UUID、ID_WORKER_STR。其中,ID_WORK…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部