Java 内部クラスのシリアル化について

ケース 1:

public class DistributeData implements  SerializedName{
    
    

 public class CodeDetail {
    
    ...}

}

CodeDetail はシリアル化されません。

ケース 2:

public class DistributeData implements  SerializedName{
    
    

 public class CodeDetail implements  SerializedName{
    
    ...}

}

NotSerializableException を報告し、エラーをチェックします。CodeDetail クラスは Serializable インターフェイスを実装していますが、CodeDetail はプロジェクト内の内部クラスの形式で定義されています。

また、内部クラスはシリアル化できません。

内部クラスの場合、静的内部クラスのみをシリアル化できます。次のようにする必要があります:

public class DistributeData implements  SerializedName{
    
    

 public static class CodeDetail implements  SerializedName{
    
    ...}

}

したがって、不要なトラブルを避けるために、内部クラスの使用を減らし、過度に制限するようにしてください。

ケース 3:

public class DistributeData {
    
    

 public class CodeDetail implements  SerializedName{
    
    ...}

}

操作中に例外が報告されます。シリアル化インターフェイスを実装していないオブジェクトはシリアル化できません。
すべての内部クラス、ローカル内部クラス、および匿名内部クラスは、外部カプセル化クラスのインスタンス変数とメソッドに直接アクセスできます。一方、静的に入れ子になったクラスはできません。
内部クラス、ローカル内部クラス、および匿名内部クラスのインスタンスはすべて、外部カプセル化クラス インスタンスへの暗黙的な参照を保持します。Java オブジェクトのシリアル化では、オブジェクト内のすべてのオブジェクト メンバーがシリアル化インターフェイスを実装する必要があります。したがって、内部クラスのみが直列化を実装し、外部のカプセル化クラスが直列化インターフェイスを実装していない場合、内部クラスが直列化されるときに例外が報告されます。

原理説明:

内部クラスはネストされたクラスの一種であり、ネストされたクラスには 4 つのタイプがあります。

静的ネストクラス 静的ネストクラス
内部クラス 内部クラス (非静的)
ローカルクラス ローカルクラス (メソッド内で定義)
匿名クラス 匿名クラス 静的
  ネストクラスの動作は通常のクラスに近く、他の 3 つは実際の内部クラスです。違いは範囲にあります。
ここに画像の説明を書きます

http://www.jianshu.com/p/8b8bfe1fd488

おすすめ

転載: blog.csdn.net/lrxb_123/article/details/73863807