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

Java:何时在序列化期间添加readObjectNoData()?

谭修然
2023-03-14
问题内容

我正在阅读“有效Java”中的序列化一章。我试图理解本书中的以下段落。

如果使用可序列化和可扩展的实例字段实现类,则应注意这一点。如果该类具有将其实例字段初始化为其默认值(整数类型为零,布尔值为false,对象引用类型为null)而将被违反的不变量,则必须将此readObjectNoData方法添加到该类:

    // readObjectNoData for stateful extendable serializable classes
     private void readObjectNoData() throws InvalidObjectException {
             throw new InvalidObjectException("Stream data required");
     }

我不确定上述陈述的含义。

为了测试这一点,我创建了一个Person类(可序列化和可扩展)

   class Person   implements Serializable{

       private String name;

       private int age;

      Person() {
         this("default",1);
      }


     Person(String name, int y) {
       this.name = name;
        this.age = y;
      }
    }

还有一个扩展它的Employee类。

     class Employee extends Person  {

      String address ;


    public Employee()
    {
        super();
        address ="default_address";
    }

    public Employee(String name , int age, String address)
    {
        super(name,age);
        this.address = address;
    }
           }

我创建的Person类中是否有任何不变式?什么时候会受到侵犯?我在Employee类中复制了readObjectData()方法的代码,但从未被调用。什么时候调用readObject()方法?我想念什么吗?


问题答案:

Java对象序列化规范中的readObjectNoData部分似乎很有趣(请参阅下文)。

您对问题的编辑给出了一个完美的例子。如果Employeeserialized,当它并未扩大Person,后来deserialized当它没有那么Person部分将被初始化为空字符串,0岁。使用此方法,可以将它们分别初始化为“名称”和1。

对于可序列化的对象,在子类实例被反序列化并且序列化流未将所讨论的类列为反序列化对象的超类的情况下,readObjectNoData方法允许类控制其自身字段的初始化。在接收方使用与发送方不同的反序列化实例类的版本,并且接收方的版本扩展了发送方版本未扩展的类的情况下,可能会发生这种情况。如果序列化流已被篡改,也会发生这种情况。因此,尽管源流“敌对”或不完整,但readObjectNoData对于正确初始化反序列化的对象很有用。

private void readObjectNoData() throws ObjectStreamException;

每个可序列化的类都可以定义自己的readObjectNoData方法。如果可序列化的类未定义readObjectNoData方法,则在上述情况下,该类的字段将被初始化为其默认值(如JavaTM语言规范第二版第4.5.5节中列出);当引入了对readObjectNoData方法的支持时,此行为与JavaTM
2
SDK标准版1.4之前的ObjectInputStream的行为一致。如果可序列化的类确实定义了readObjectNoData方法,并且出现了上述情况,



 类似资料:
  • 问题内容: 我找不到在Gson进行序列化期间添加自定义字段的简单方法,我希望其他人可以提供帮助。 这是一个示例类来展示我的问题: 当我序列化类AI时,想返回以下内容: 其中url_to_user未存储在我的类A的实例中,但可以与数据一起在类A的实例中生成。 有没有简单的方法可以做到这一点?我宁愿避免只添加一个字段就编写整个序列化程序。 问题答案: 用得到,用它可以动态交互。

  • 映射器: 要序列化的类: 我不懂这个领域: 从Jackson那里找到的?我用日志检查了我的本地地图,结果发现这个字段不存在,但在序列化过程中它出现了。

  • 杰克逊v1。9.13 spring 3.2.0嗨,我花了好几天的时间试图弄清楚如何在序列化期间从bean向JSON中添加字段。 这似乎是一个非常基本的功能,但我每走一条路都会碰到橡胶墙。 我想要实现的是: 示例bean: 输出: 我认为最简单的方法是扩展BeanSerializer,编写“_type”属性,并委托剩余字段的超类序列化。问题是,方法的可访问性和一些关键方法的“最终”条款使其陷入困境。

  • 问题内容: 我有一个对象,即时通讯读取和写入,并从和。我不断收到Java期望的错误,但发现了另一个。 在我的课堂上,我已经实现并拥有一个我认为足够的领域。 我是Java序列化的新手。我在这里想念什么? 编辑 如果有关系,我实际上是在尝试读写 这是完整的痕迹: 问题答案: 您正在读取文件吗?在这种情况下,是否立即添加serialVersionUID无关紧要,它不同于文件中存储的那个,并且会创建异常。

  • 问题内容: 我有一个包含a 和a的类。现在,我想使用gson序列化对象,但排除该字段。 如您所见,我已经尝试使用,但是似乎没有任何作用。另外,我已经将该字段设置为私有,因为我认为这会“覆盖” 但运行以下代码: 仍然会导致以下文件内容没有错误: 那我在做什么错?我现在一无所知,并且希望得到任何帮助,因为这似乎行不通。 提前致谢。 问题答案: 为了获得此结果,您需要使用注释所有字段: 并将Gson配置

  • 问题内容: 以下代码导致OutOfMemmoryError:大约300万行的堆空间。使用64位安装,分配给JVM的内存为4 GB。 ArrayList引用的内存在while循环的每次迭代中都可以进行垃圾回收,并且由于堆空间的原因,内部JVM 在抛出OutOfMemory错误之前会调用垃圾回收()。 那么为什么会发生异常呢? 问题答案: 是的? 如果是这样,那就是您的问题:An 会对曾经写入过的 每