什么是默认和自定义序列化? 如果物理和逻辑表示没有区别,并且不需要使用自定义序列化,则默认序列化是合适的。 但我无法获得真正的默认和习惯。
//Default serialization form :`
public final class StringList implements Serializable {
private int size = 0;
private Entry head = null;
}
private static class Entry implements Serializable {
String data;
Entry next;
Entry previous;
}
... // Remainder omitted
}
//Custom serialization form
public final class StringList implements Serializable {
private transient int size = 0;
private transient Entry head = null;
// No longer Serializable
private static class Entry {
String data;
Entry next;
Entry previous;
}
}
那么有很好的解释例子吗?
答案 0 :(得分:0)
序列化是将对象映射到串行表示的过程。如果要序列化对象,则其类必须实现Serializable
。
在默认表单中,将序列化包含其所有字段的两个类。但是,在您的自定义表单中,transient
中的StringList
修饰符表示相应的字段size
和head
未被序列化。注意,类本身将被序列化,只是没有那些字段。由于Entry
未实现Serializable
,因此无法再将其序列化,如上所述。
答案 1 :(得分:0)
默认序列化使用默认规则进行序列化。
所有Serializable
而非瞬态字段都是序列化的。
要成为Serializable
类,该类必须实现Serializable
接口。如果您尝试序列化类不是从Serializable
派生的对象,或者至少拥有该类不从Serializable
接口派生的字段的对象,并且该字段没有transient修饰符,如果序列化对象,则会在运行时发生异常以指示序列化错误。
如果您不希望将默认规则应用于所有字段,则可以使用transient修饰符定义要忽略的字段以进行序列化,并且您也可以不在这些类中实现Serializable
接口字段(如果你有他们的手)。不实现Serializable
接口不是强制性的,但如果您尝试序列化非Serializable
字段,则会发生异常,如果您忘记将瞬态修饰符应用于字段,则可以保护您。
最后,当您禁用某些字段进行序列化时,此字段不会保存在序列化输出中。因此,当您反序列化序列化的数据时,不会检索它们。
在使用自定义序列化表单的示例中,类中没有任何序列化,因为所有字段都是瞬态的,而在第一个带有默认序列化的示例中,所有字段(size
和head
)都是序列化的。