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日

相关文章

  • java开发之读写txt文件操作的实现

    Java开发之读写txt文件操作的实现攻略 1. 读取txt文件 1.1 创建文件对象 使用Java中的File类,可以创建一个文件对象。代码如下: File file = new File("path/to/file.txt"); 其中,”path/to/file.txt”是要读取的txt文件的路径。需要根据实际路径进行替换。 1.2 …

    Java 2023年5月20日
    00
  • Spring 与 JDK 线程池的简单使用示例详解

    下面是Spring与JDK线程池的简单使用示例详解的攻略。 Spring与JDK线程池的简单使用示例详解 什么是线程池 线程池是一种多线程的解决方案,它的核心思想是在应用程序启动的时候,提前创建若干个线程并放入线程池中,并维护这些线程的生命周期,应用程序需要处理任务的时候,不需要再临时创建新的线程,而是从线程池中获取可用的线程。 JDK线程池的使用 Java…

    Java 2023年5月18日
    00
  • Java中Arrays的介绍及使用方法示例

    Java中Arrays的介绍及使用方法示例 1. 什么是Arrays 在Java编程语言中,Arrays是一个类,用来操作数组的工具类,包含了一些静态方法,如排序和二分查找等。 2. Arrays的常用方法 2.1 初始化数组 Arrays类提供的最常用的初始化数组的方法是:Arrays.fill(),可以用来填充一个数组。 // 初始化长度为10的数组,全…

    Java 2023年5月26日
    00
  • 基于Lombok集成springboot遇到的坑

    好的。首先,Lombok是一款Java的插件工具库,它可以简化Java代码的编写,减少代码的重复,提高开发效率。Spring Boot是一款基于Spring框架的快速开发框架,在实现快速开发的同时也减少了很多繁琐的配置工作。将Lombok和Spring Boot进行集成,可以更快速地开发出高质量的Java应用。 但是,在集成Lombok和Spring Boo…

    Java 2023年5月26日
    00
  • Java Process类的详解及实例代码

    Java Process类的详解及实例代码 简介 在Java中,Process类是用于处理系统进程的类,可以通过该类启动新的进程,并与该进程交互(如:中断该进程的执行)。 Process类常用方法 1. exec()方法 该方法用于启动一个新的进程,并返回一个Process对象。该方法接受一个字符串类型的参数,参数值为要启动的进程的命令字符串。例如: Pro…

    Java 2023年5月23日
    00
  • 图文演示Flash+ASP实现用户登录/注册程序

    关于“图文演示Flash+ASP实现用户登录/注册程序”的完整攻略,我会结合示例进行详细讲解。 第一部分:环境准备 在开始实现用户登录/注册程序之前,我们需要进行环境配置。 首先,我们需要安装Flash和ASP环境。Flash是用于制作交互式动画和界面的软件工具,而ASP是一种服务器端脚本技术,用于构建动态网站。 其次,我们需要准备一个数据库,用于存储用户的…

    Java 2023年6月15日
    00
  • 关于Java中的IO流总结(推荐)

    关于Java中的IO流总结(推荐) 概述 在Java中,IO(Input/Output)流是通常用于读取和写入数据的方式。在Java中的IO包提供了很多实现,包括了输入/输出流、文件读取和写入、网络数据传输等。IO流以字节流和字符流两种形式存在,对应到Java中分别为InputStream/OutputStream和Reader/Writer。 IO流的分类…

    Java 2023年5月26日
    00
  • ssm框架+PageHelper插件实现分页查询功能

    以实现用户管理模块的分页查询功能为例,在使用ssm框架搭建基础框架后,我们可以按照以下步骤实现分页查询功能。 步骤一:添加PageHelper依赖 在项目的pom.xml文件中添加以下依赖: <dependency> <groupId>com.github.pagehelper</groupId> <artifact…

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