在Java序列化中,如果一个类有多个对象(组合),那么将以什么顺序检索状态?

在Java序列化中,如果一个类有多个对象(组合),那么将以什么顺序检索状态?,java,serialization,Java,Serialization,如果一个类被定义为 public class A implements java.io.Serializable { Example a; Test b; Another c; } 在检索状态时,将按什么顺序检索? A的目标是什么? A. B 字节码的顺序很重要,通常与编写java时的顺序相同 将加载一个 b将被加载 c将被加载 如果没有抛出异常,则放置a、b、c 如果存在,则执行方法readObject 注意:不会执行任何构造函数! 注意:模糊处理程序可能会更改字段名

如果一个类被定义为

public class A implements java.io.Serializable
{
    Example a;
    Test b;
    Another c;
}
在检索状态时,将按什么顺序检索? A的目标是什么? A. B
字节码的顺序很重要,通常与编写java时的顺序相同

  • 将加载一个
  • b将被加载
  • c将被加载
  • 如果没有抛出异常,则放置a、b、c
  • 如果存在,则执行方法readObject
  • 注意:不会执行任何构造函数!
    注意:模糊处理程序可能会更改字段名。

    如果序列化
    A
    ,它将被写为:

    • A的开始
    • a
    • b
    • c
    • A的结尾
    反序列化以序列化写入流的相同顺序读取流。然而,序列化流只是一个八位字节序列,可能具有不同顺序的
    a
    b
    c
    (字段最多只能分配一次)

    此外,这些对象可以有其他相互引用。例如,即使在运行时,
    Test
    无法引用另一个
    b
    的反序列化可能包括反序列化到
    c
    的对象

  • 与这里的其他答案相反,没有指定顺序,只是基类先于派生类

  • 这无关紧要,因为字段名也被传递,所以流是明确的

  • 它可以由类本身更改

  • 与这里的答案相反,为流中的每个对象执行最近的不可序列化超类的默认构造函数。在这种情况下,至少有四个


  • 请参阅。

    下定决心。它可以“写为a/b/c”,也可以“可能有不同顺序的a、b、c”。@EJP它可以写为a/a/b/c/a,但可能由流的不同版本创建的流或可能在vi中创建的流可能包含顺序为a/c/b/a/a的数据。
    a、b、c
    可以是任何顺序,并执行不可序列化的基类构造函数:在本例中,至少执行四个-1@EJP请解释一下。运行时在哪里知道不可序列化基类构造函数的参数?如果存在多个基类构造函数,运行库在哪里知道需要执行什么不可序列化的基类构造函数?