OptionalField]と[非文字化]の違いは何ですか
-
24-09-2019 - |
質問
Transcenderでこの質問に出くわしました:
脱介入中にその価値が必要ない場合、フィールドに何を適用すべきですか?
me = [nonerialized]、answer = [optionalfield
私の腸の反応は無意味でしたが、Transcenderは私が間違っていると言います。 [非腹化]属性に関する限り、何に注意すべきかをよく考えていますが、それでもこれをクリアしたいと思います。
私が知る限り、前者は同じアセンブリの新しいバージョンと古いバージョン間のバージョン化の競合との関係を持っています。後者は、フィールドのフルストップをシリアル化しないことに関心があります。これら2つを際立たせるかもしれない他に何かありますか? MSDNは、xmlignoreAttributeを使用してxmlformatterを使用してバイナリフォーム散布とsoapformatterで使用されているため、これについてあまり語っていません。
私の2番目の質問は、2つの属性のいずれかを混ぜて一致させることができることです。私はまだそれらを使用していません。
これをそこに投げ出すだけですが、私の答えは、[オンデシリアル化]とIdeserilizationCallbackインターフェイスが実装されている方法と関係がありますか?
アップデート:
オプションのフィールド属性は、データメンバーが保有する値をシリアル化しないことを知っていますが、非文字化されていない場合は、データメンバーまたはその値をシリアル化することさえしません。
解決
これらの2つの属性は、シリアル化方程式の反対側に使用されます。
使用するとき [NonSerialized]
, 、「このフィールドはまったくシリアル化されるべきではない」と言っているので、「時間を節約する」属性のようなものです。基本的に、あなたはフィールドはオブジェクトのシリアル化された状態にとって重要ではないと言っています。
使用するとき [OptionalField]
, 一方、あなたはまだフィールドをシリアル化するつもりです。ただし、フィールドがある場合 ない で 時間を読んでください (ストリームがオブジェクトに偏りがある場合)、例外は発生しません。この属性は、互換性を破ることなく、既存のシリアル化可能なタイプに新しいフィールドを追加できるようにすることを目的としています。オブジェクトの古いバージョン(そのフィールドが欠落している)は、正常に脱必要にされます。
他のヒント
ただ英語で遊んでいるだけで、 必要ありません と オプション この場合、同じことを意味します。
あなたの最初の質問のために、あなたはそれを頭にかなり釘付けにしました。 [OptionalField]
基本的に、古いシリアル化が新しい定義と互換性があることを可能にします。 [NonSerialized]
シリアル化されたデータには見つからないことを意味します。
違いを考えると、なぜあなたが両方を単一のフィールドに置く理由を想像することはできませんが、コンパイラが文句を言うだろうと思います。