【问题标题】:Serialization and Deserialization rules for member variable of Serializable ObjectSerializable Object成员变量的序列化和反序列化规则
【发布时间】:2016-04-21 05:14:52
【问题描述】:

我已阅读Constructor Calls while serializationSerialization Rules,但无法找出成员变量的所有规则。

我有以下问题:

学生.java

class Person {
}
class Student extends Person implements Serialization {
   List<Book> books; 
   Student(){}
   Student(List<Book> books) {
      this.books = books;
   }
}

class Book implements Serialization {
  Book() {}
  String bookId;
  Book(String bookId) {
      this.bookId = bookId;
  }

}

这里 Student 是可序列化的,而 Book 类也是可序列化的,那么构造函数调用可序列化和反序列化的规则是什么。

  1. Book 类中是否需要默认构造函数? 如果是,那么为什么在反序列化时需要默认构造函数。
  2. 序列化和反序列化时如何调用构造函数?

【问题讨论】:

    标签: java serialization deserialization


    【解决方案1】:

    在下面查看我的答案:

    Is required default constructor in Book class?
    

    -> 是的,这是强制性的,否则序列化将失败。

    How constructor calls while serialization and deserialization?
    

    -> 序列化使用反射,默认构造函数必须使用反射。

    【讨论】:

    • 据我所知,我知道 Student 类不需要默认构造函数,因为它实现了序列化,而默认构造函数只在超类中需要,因为现在不实现序列化 为什么 Book 类中需要默认构造函数因为它已经实现了序列化。
    • 这里的超级课在哪里?你说的是 Object 类吗?
    • 我试图了解反序列化时何时需要默认构造函数。据我所知,只有当类没有实现序列化时才需要默认构造函数。
    • 此信息的来源是什么 -> “据我所知,仅当类未实现序列化时才需要默认构造函数。”如果你使用继承,那么父类必须有默认构造函数,但这里没有父类。
    • 在超类中应用的成员引用是否应用相同的规则?假设有person超类student。
    【解决方案2】:

    实际上,您应该将a no-arg constructor 放在Person 的类中,它是Student 的超类。

    如果不这样做,反序列化时会在运行时抛出java.io.InvalidClassException

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 2020-02-16
      • 2012-10-31
      • 1970-01-01
      相关资源
      最近更新 更多