6

これは再投稿だと思いますが、良い情報が見つからないようです。シリアル化が実際にどのように機能するのか(実際には逆シリアル化)疑問に思っていました。私が疑問に思っているのは、私が実際には私有地に裏打ちされていない不動産を持っていると言うかどうかです。すなわち:

public string SomeProp {
   get {
      return GetValue("SomePropKey");
   }
   set{
      SetValue("SomePropKey", value);
   }
}

デシリアライズすると、セッターが呼び出されますか?オブジェクトをシリアル化すると、正しい値が出力ストリームに書き込まれるため、getterはシリアル化時に呼び出されます。これは奇妙な状況のように思えますが、実際に何が起こっているのでしょうか。それとも私はこれを複雑にしすぎているのでしょうか...。

4

3 に答える 3

8

シリアライゼーションに使用しているメカニズムに完全に依存します。

XmlSerialization を使用している場合は、はい、setter が呼び出されます。

データ コントラクトのシリアル化 (DataContractSerialization) を使用している場合、DataMember 属性をプロパティに (バッキング フィールドではなく) 適用すると、getter/setter が呼び出されます。

.NET で元のシリアル化メカニズム (IFormatter 実装) を使用している場合、フィールドに格納された値のみをシリアル化するため、このシナリオは不可能です。

于 2009-01-21T19:30:50.050 に答える
0

XMLシリアライゼーション、または「通常の」シリアライゼーション(石鹸/バイナリ)について話しているのですか?-afaik-これら2つのシリアライゼーション手法は異なるからです。

私の知る限り、 BinaryFormatter または SoapFormatter を使用する場合、プロパティではなくフィールドがシリアル化/逆シリアル化されます。
逆シリアル化では、SerializationInfo および StreamingContext 引数を持つ特別な 2 引数コンストラクターが使用されると思います。

ただし、ISerializable インターフェイスを実装することで、シリアル化プロセスを制御することを妨げるものは何もありません。次に、プロパティを使用して値を設定したい場合は、完全に設定できると思います。

于 2009-01-21T19:31:28.833 に答える
0

あなたの質問に対する直接的な回答ではないことは承知しており、あなたが探していた回答はすでに得られています。しかし、私はこれを差し控えたくありませんでした。Reflectorを使用して、Base Class Library のソースを確認できます。これは、.net フレームワークの内部について理解を深め、知識を広げるための優れた方法です。

于 2009-01-21T19:35:00.917 に答える