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中的Pair详细

    Java中的Pair详解——完整攻略 在Java中,我们经常需要使用一对相关联的值,以便于更好地处理数据。Java中提供了一个名为Pair的类,用于表示这样的一对值。在这篇文章中,我们将详细介绍Java中的Pair类及其用法。 1. Pair类的定义 Pair类是JavaFX库中的一个类,用于存储两个相关联的值。通常情况下,我们使用泛型来定义Pair类,以便…

    Java 2023年5月19日
    00
  • Spring Security拦截器引起Java CORS跨域失败的问题及解决

    Spring Security拦截器引起Java CORS跨域失败的问题及解决 在使用Spring Security进行接口保护的时候,经常会遇到因为跨域问题导致前端无法访问服务器接口的问题。本文将详细介绍Spring Security拦截器引起Java CORS跨域失败的问题及解决。 什么是CORS跨域 CORS(Cross-Origin Resource…

    Java 2023年5月20日
    00
  • C#怎么实现手机短信发送功能

    为了实现C#语言中的手机短信发送功能,我们需要使用短信接口提供商的服务。以下是一些实现方法的步骤: 步骤一:选择一个短信接口提供商 首先,我们需要选择并注册一个短信接口提供商。常见的短信接口提供商有阿里云、腾讯云、云片等。注册后,我们可以得到一些必要的信息,例如接口地址、账号、密码。 步骤二:调用短信接口 接着,我们需要使用HTTP协议来调用短信接口。我们可…

    Java 2023年5月19日
    00
  • Java 区分文本中的中英文字符函数

    这里我来详细讲解一下Java中区分文本中的中英文字符函数的攻略。 一、问题背景 在中英文字串混合的文本中,有时需要对中英文字进行区分,特别是在字符串长度计算、字符截取等场景。而英文字母在Java中对应的unicode编码范围(0x0000-0x007F)与中文的unicode编码范围(0x4E00-0x9FA5)是不同的,因此可以通过unicode编码的值来…

    Java 2023年5月27日
    00
  • Spring Boot Shiro在Web应用中的作用详解

    Spring Boot Shiro 在 Web 应用中的作用详解 简介 Shiro 是一个用于 Java 应用的轻量级安全框架,提供了认证、授权、加密以及会话管理等功能,可以方便地集成进 Spring Boot 项目中使用和配置。本文将详细介绍在 Web 应用中使用 Spring Boot Shiro 的过程和作用。 步骤 1. 添加依赖项 在 pom.xm…

    Java 2023年5月20日
    00
  • JSONObject toJSONString错误的解决

    当使用Java中的JSONObject类的toJSONString()方法将Java对象序列化为Json字符串时,可能会出现错误。本文将提供一些错误的解决方法。 错误1:No serializer found 当使用toJSONString()方法将Java对象序列化为Json字符串时,可能会出现以下错误: org.codehaus.jackson.map.…

    Java 2023年5月26日
    00
  • Java代码块与代码加载顺序原理详解

    Java 代码块与代码加载顺序原理详解 在一个类中,我们可以使用代码块来初始化一些类变量以及执行一些常规的代码逻辑。那么代码块和代码加载顺序之间又有何关系呢?本文将会深入详细地讲解这个问题。 代码块 Java 中的代码块有三种:静态代码块、普通代码块、构造代码块。这三种代码块都可以在Java程序中进行使用,其作用各异,在这里我们只关注静态代码块。 静态代码块…

    Java 2023年5月23日
    00
  • MyBatis实现表连接查询写法(三种对应关系)的方法总结

    关于“MyBatis实现表连接查询写法(三种对应关系)的方法总结”的完整攻略,我可以提供如下内容: 1. 需求 在实际开发中,经常需要对多个表进行联合查询,通常使用某些条件将多个表的数据关联起来。 2. 联接查询分类 联接查询可分为三种对应关系: 2.1 一对一 一对一映射是指两个表中的一行只能对应另一个表中的一行, 例如 一个学生对应一个身份证,一个身份证…

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