3

みんな:

一部の使用クラスがシリアライズ可能をサポートしていないことを回避する方法を見ました。しかし、この方法を使用する理由がわかりません。そこで、ここで質問を投げかけました。

したがって、前のコードは次のようになります

    [Serializable]
    Class OutterClass
    {
        public UsingClass UsingClassMember
        {
            get;
            set;
        }
    }

ここで、OutterClass をシリアライズしようとすると、UsingClass がシリアライズをサポートしていないため、例外が発生します。明らかに、OutterClass をシリアル化する場合は、OutterClass のすべてのメンバーがシリアル化をサポートする必要があります。

しかし、次のようにコードを変更すると。シリアル化操作は正常に実行できます。

    [Serializable]
    Class OutterClass
    {
        [NonSerialized]
        private UsingClass m_UsingClassMember;
        public UsingClass UsingClassMember
        {
            get { return m_UsingClassMember; };
            set { m_UsingClassMember = value };
        }
    }

この変更の理由はわかりません。プロパティ UsingClassMember のシリアル化では、クラス UsingClass 自体をシリアル化する必要はないようです。誰か説明してもらえますか?

ありがとう!

4

4 に答える 4

1

データをシリアル化するかどうかを決定する必要がUsingClassMemberあります。

シリアル化する場合は、 でマークUsingClass[Serializable]ます。後でデータを逆シリアル化するときに、シリアル化前のこのプロパティの値を取得します。

シリアライズしたくない場合は、対応するフィールドを でマークし[NonSerialized]ます。この場合、プロパティは逆シリアル化後に null になります (カスタム逆シリアル化が使用されていない場合)。

プロパティの意味とユースケースでのシリアル化の目的に基づいて、どのアプローチを選択するかを決定できるのは、あなただけです。

于 2013-07-18T02:53:26.087 に答える
1

BinaryFormatter と SoapFormatterは、プロパティではなく、フィールドのみをシリアル化します。最初の例では、自動実装されたプロパティによって、シリアル化できない隠しフィールドが生成されます。シリアライザは、この自動生成されたシリアライズ不可能なフィールドを認識し、例外を発生させます。

2 番目の例では、フィールドを NonSerialized としてマークすると、シリアライザーはこのフィールドを無視し、外部クラスをシリアル化できます。

于 2013-07-18T03:37:58.390 に答える
1

C# auto プロパティのシリアル化を防ぐ方法の良い例があります。

属性 'NonSerialized' は、この宣言タイプでは無効です。'field' 宣言でのみ有効です。

そのため、C#の自動プロパティに「NonSerialized」を設定することはできませんが、2番目の例のようにフィールドを焼き付けたプロパティの場合は、あなたがしたように設定できます。次に、プロパティとフィールドの両方がシリアル化されません。

2 番目のケースでは、コンパイラはプロパティを無視します。これは、下線フィールドがシリアル化されておらず、最初のケースのような例外が発生しないためです。

Serializableシリアル化する場合は、プロパティを onに設定UsingClassする必要がありますが、シリアル化する必要がない場合は、2 番目の方法として、または[XmlIgnoreAttribute]auto プロパティを使用して行うことができます

于 2013-07-18T03:14:40.763 に答える
0

属性を含むものをシリアル化/逆シリアル化すると、NonSerializedその属性を持つオブジェクトは考慮されません。逆シリアル化すると、の値はUsingClassMembernullまたはデータ型のデフォルトが何であれ)になります

于 2013-07-18T02:53:49.623 に答える