6

トランセンダーでこの質問に出くわしました:

逆シリアル化中にフィールドの値が必要ない場合、フィールドに何を適用する必要がありますか?

Me = [NonSerialized]、ANSWER = [OptionalField]

私の腸の反応は NonSerialized でしたが、Transcender は私が間違っていると言います。[Nonseralized] 属性に関する限り、何に注意すればよいかはよくわかりますが、それでもこれを解決してほしいと思います。

私が知る限り、前者は同じアセンブリの新しいバージョンと古いバージョンの間のバージョン管理の競合と関係があります。後者は、フィールド FULLSTOP をシリアル化しないことに関心があります。この2つを際立たせる何かが他にありますか?MSDN は、XMLIgnoreAttribute を使用する XMLFormatter を使用して BinaryFormatters と SoapFormatter で使用されるため、これについてあまり言及していません。

2 番目の質問は、2 つの属性のいずれかを組み合わせて一致させることはできますか? 私はまだそれらを使用していません。

これを投げるだけですが、私の答えは [OnDeserialized] と IdeserilizationCallback インターフェイスが実装されている方法と関係がありますか?

アップデート:

オプションのフィールド属性はデータメンバーが保持する値をシリアル化しないことを知っていますが、NonSerialized はデータメンバーまたはその値をシリアル化しません。

4

2 に答える 2

8

これら 2 つの属性は、シリアライゼーション方程式の反対側に使用されます。

を使用する[NonSerialized]と、「このフィールドはまったくシリアル化されるべきではない」と言っているので、「時間を節約する」属性になります。基本的に、フィールドはオブジェクトのシリアル化された状態には関係ないと言っています。

[OptionalField]一方、を使用すると、フィールドをシリアル化することになります。ただし、読み取り時(ストリームがオブジェクトに逆シリアル化されるとき) にフィールドが欠落している場合、例外は発生しません。この属性は、互換性を損なうことなく、既存のシリアル化可能な型に新しいフィールドを追加できるようにすることを目的としています。古いバージョンのオブジェクト (そのフィールドがない) は通常どおり逆シリアル化されます。

于 2010-04-06T16:33:57.977 に答える
1

この場合、必須ではなくオプションでも同じことを意味します。

あなたの最初の質問については、頭に釘付けになりました。 [OptionalField]基本的に、古いシリアライゼーションが新しい定義と互換性を持つことを可能にします。 [NonSerialized]シリアル化されたデータで見つからないことを意味します。

違いを考えると、なぜ両方を単一のフィールドに置くのか想像できませんが、コンパイラーが文句を言うだろうと思います。

于 2010-04-06T16:37:10.797 に答える