さて、DataContractSerializerをオブジェクトグラフで動作させました。詳細については、以前の質問を参照してください。
デシリアライザーには、この契約に対応するタイプの知識はありません。
ただし、私のフィールドの1つである_UserPropertyDefinitionsは、次のように定義されています。これは、このユーザーがデータ構造内のオブジェクトに追加できるカスタムプロパティのリストを定義します。文字列はプロパティを識別するための一意のキーであり、Typeはプロパティのタイプであり、常にBool、Int、Stringなどの基本的なタイプです。
各オブジェクトには、対応するDictionary(String key、Object value)コレクションがあり、「ユーザープロパティ」のいずれかに設定した値を格納します。
[DataMember]
private Dictionary<string, Type> _UserPropertyDefinitions;
このプロパティが空のコレクションの場合、オブジェクトグラフは正常にシリアル化されますが、このコレクションにカスタムプロパティを追加すると、DataContractSerializerでシリアル化しようとすると次の例外が発生します。
データコントラクト名が「RuntimeType:http ://schemas.datacontract.org/2004/07/System」の「System.RuntimeType」と入力する必要はありません。静的に不明なタイプを既知のタイプのリストに追加します。たとえば、KnownTypeAttribute属性を使用するか、DataContractSerializerに渡される既知のタイプのリストにそれらを追加します。
このフィールドのDataMember属性を削除すると、例外を発生させずにシリアル化/逆シリアル化できますが、もちろん、このフィールドで作成した設定は失われます。