默认和自定义序列化有什么区别?

时间:2016-12-13 11:20:24

标签: java serialization

什么是默认和自定义序列化? 如果物理和逻辑表示没有区别,并且不需要使用自定义序列化,则默认序列化是合适的。 但我无法获得真正的默认和习惯。

//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;
    }
}

那么有很好的解释例子吗?

2 个答案:

答案 0 :(得分:0)

序列化是将对象映射到串行表示的过程。如果要序列化对象,则其类必须实现Serializable

在默认表单中,将序列化包含其所有字段的两个类。但是,在您的自定义表单中,transient中的StringList修饰符表示相应的字段sizehead 未被序列化。注意,类本身将被序列化,只是没有那些字段。由于Entry未实现Serializable,因此无法再将其序列化,如上所述。

答案 1 :(得分:0)

默认序列化使用默认规则进行序列化。 所有Serializable而非瞬态字段都是序列化的。 要成为Serializable类,该类必须实现Serializable接口。如果您尝试序列化类不是从Serializable派生的对象,或者至少拥有该类不从Serializable接口派生的字段的对象,并且该字段没有transient修饰符,如果序列化对象,则会在运行时发生异常以指示序列化错误。

如果您不希望将默认规则应用于所有字段,则可以使用transient修饰符定义要忽略的字段以进行序列化,并且您也可以不在这些类中实现Serializable接口字段(如果你有他们的手)。不实现Serializable接口不是强制性的,但如果您尝试序列化非Serializable字段,则会发生异常,如果您忘记将瞬态修饰符应用于字段,则可以保护您。

最后,当您禁用某些字段进行序列化时,此字段不会保存在序列化输出中。因此,当您反序列化序列化的数据时,不会检索它们。

在使用自定义序列化表单的示例中,类中没有任何序列化,因为所有字段都是瞬态的,而在第一个带有默认序列化的示例中,所有字段(sizehead)都是序列化的。