2016-12-13 3 views
0

デフォルトおよびカスタムシリアル化とは何ですか? 物理的および論理的表現が異なっていない場合、およびカスタムの直列化を使用する必要がない場合は、デフォルトの直列化が適切です。 しかし、私は本当にデフォルトとカスタムを得ることができませんでした。デフォルトとカスタムのシリアル化の違いは何ですか?

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

よく説明されている例はありますか?

答えて

1

シリアル化は、オブジェクトをシリアル表現にマッピングするプロセスです。オブジェクトをシリアライズする場合は、そのクラスにSerializableを実装する必要があります。

デフォルトのフォームでは、すべてのフィールドを持つ両方のクラスがシリアル化されます。ただし、カスタムフォームでは、StringListtransient修飾子は、対応するフィールドsizeheadとなり、となることを示しています。クラス自体は、これらのフィールドがなくてもシリアライズされることに注意してください。 EntrySerializableを実装していないため、上記のようにもうシリアル化することはできません。

1

デフォルトのシリアル化では、既定の規則を使用してシリアル化が行われます。 すべてSerializableで、トランジェントフィールドはシリアル化されていません。 Serializableクラスであるためには、クラスはSerializableインターフェイスを実装する必要があります。クラスが派生しないオブジェクトをSerializableから継承しようとするか、少なくともクラスがSerializableインターフェイスから派生しないフィールドを所有するオブジェクトで、フィールドに一時的修飾子がない場合は例外が発生しますオブジェクトをシリアライズするとシリアライゼーションエラーが発生します。

すべてのフィールドにデフォルトのルールを適用したくない場合は、transient修飾子を使用してシリアル化を無視するフィールドを定義し、Serializableインターフェイスをこれらのフィールドのクラスに実装することもできます(ifあなたはそれらに手を持っている)。 Serializableインターフェイスを実装していないことは必須ではありませんが、Serializableフィールドをシリアル化しようとすると例外が発生するため、トランジエント修飾子をフィールドに適用するのを忘れた場合に保護されます。

最後に、シリアル化のフィールドを無効にすると、このフィールドはシリアル化された出力に保存されません。したがって、シリアル化したデータをシリアル化解除するときには、それらを取得しません。

カスタムシリアル化フォームの例では、すべてのフィールドが一時的であるため、クラス内に何もシリアル化されませんが、最初の例ではデフォルトシリアル化ですべてのフィールド(sizeおよびhead

関連する問題