当前位置: 首页 > 面试题库 >

当只有子类实现可序列化时,序列化如何工作

万浩淼
2023-03-14
问题内容

子类具有已实现的Serializable接口。

import java.io.*;

public class NewClass1{

    private int i;
    NewClass1(){
    i=10;
    }
    int getVal() {
        return i;
    }
    void setVal(int i) {
        this.i=i;
    }
}

class MyClass extends NewClass1 implements Serializable{

    private String s;
    private NewClass1 n;

    MyClass(String s) {
        this.s = s;
        setVal(20);
    }

    public String toString() {
        return s + " " + getVal();
    }

    public static void main(String args[]) {
        MyClass m = new MyClass("Serial");
        try {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("serial.txt"));
            oos.writeObject(m); //writing current state
            oos.flush();
            oos.close();
            System.out.print(m); // display current state object value
        } catch (IOException e) {
            System.out.print(e);
        }
        try {
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("serial.txt"));
            MyClass o = (MyClass) ois.readObject(); // reading saved object
            ois.close();
            System.out.print(o); // display saved object state
        } catch (Exception e) {
            System.out.print(e);
        }
    }
}

我在这里注意到的一件事是,父类未序列化。然后,为什么它没有抛出却NotSerializableException确实显示了以下内容

输出量

Serial 20
Serial 10

同样,输出不同于SerializationDe- serialization。我只知道,这是因为父类尚未实现Serializable。但是,如果有人向我解释,在对象序列化和反序列化期间会发生什么。它如何改变价值?我不知道,我在程序中使用了注释。因此,如果我在任何时候错了,请告诉我。


问题答案:

根据可序列化的javadoc

反序列化期间,将使用该类的公共或受保护的无参数构造函数来初始化不可序列化类的字段。无参数构造函数必须对可序列化的子类可访问。可序列化子类的字段将从流中恢复。

同样,仅当要序列化的类不可序列化时,才会引发序列化异常。拥有不可序列化的父母是可以的(只要他们有一个无参数的构造函数)。对象本身不是可序列化的,并且一切都会对其进行扩展。上面的引用还说明了为什么您为value字段获得不同的值-
设置了父类的no-arg构造函数,该构造函数将value字段设置为10-该字段属于(不可序列化的)父类,因此其值不是写入/读取流。



 类似资料:
  • 问题内容: 我在android / java中对Location的子类进行序列化遇到了麻烦 位置不可序列化。我有一个名为FALocation的第一个子类,它没有任何实例变量。我已经宣布它可序列化。 然后,我有一个名为Waypoint的第二个类,看起来像这样: 序列化工作正常。 反序列化会产生跟随翼异常(腿对象包含一个航路点): 问题答案: 序列化位置绝对必要吗?也许您可以将其标记为瞬态,并在反序列

  • 问题内容: 在使用Jackson(fasterxml.jackson 2.1.1)时,是否有内置的方式仅序列化子的ID?我们要发送一个通过REST的参考文件。但是person对象非常复杂,我们可以在服务器端刷新它,因此我们需要的只是主键。 还是我需要一个定制的序列化器?还是我需要其他所有属性?这样可以防止在请求对象时将数据发送回去吗?我不确定是否需要,但我想尽可能控制它。 问题答案: 有几种方法。

  • 如果类B扩展了类A,则类B实现可序列化,而类A有一个不可序列化的公共非静态初始化变量。。。尝试使用FileOutputStream的writeObject()方法写入类“B”对象时,将序列化从a继承的不可序列化成员,以便将其与类B的其余变量一起写入文件,还是将引发NotSerializableException?我试过了,效果不错,但我不知道为什么。。。所以我不确定它是否总是有效,或者我错过了什么

  • 如果一封邮件被发送到我的收件箱,我会收到一条消息,并将内容插入数据库。我有一个组织。springframework。整合。果心信息如下: 现在,如果出现故障,我希望有故障安全恢复机制,我想的是将消息对象序列化到一个文件中,然后反序列化并更新到DB。 问题1。在这种情况下,如何序列化消息对象?2。除了序列化,还可以使用其他机制吗? 编辑我以前没有做过序列化,我听说类应该实现Serializable,

  • 问题内容: 如何序列化未实现Serializable的对象?我不能将其标记为Serializable,因为该类来自第3方库。 问题答案: 您不能序列化未实现的类,但可以将其包装在可以实现的类中。为此,您应该在包装器类上实现和,以便可以以自定义方式序列化其对象。 首先,使您的非序列化字段。 在中,首先调用流以存储所有非瞬态字段,然后调用其他方法来序列化不可序列化对象的各个属性。 在中,首先调用流以读

  • 问题内容: 我需要从包(.jar)中的XML模式(XSD)生成许多类。如何将这些类配置为可序列化? (我正在使用Eclipse和JAX-B) 问题答案: 如果您使用的是XJC,建议您阅读以下参考:用于XML绑定的JavaTM体系结构:JAXB RI供应商扩展定制 : 您必须在架构附加名称空间定义中添加xjc附加标记: 然后,在内包含一个节点: 这将导致所有具体的类都实现Serializable接口