2009-04-10 6 views
6

私はオブジェクトグラフで動作するDataContractSerializerを取得しました。詳細は前の質問を参照してください。RuntimeType:http://schemas.datacontract.org/2004/07/System 'は期待されていません

Serialization/Derialization of a tree structure

The deserializer has no knowlege of any type that maps to this contractしかし

は、私の分野の一つ、_UserPropertyDefinitions、それはこのユーザーがデータ構造内のオブジェクトに追加できるカスタムプロパティのリストを定義します。..下記のように定義されています。文字列はプロパティを識別するためのユニークなキーで、TypeはBool、Int、Stringなどのようなプリミティブ型のプロパティの型です。

各オブジェクトには対応するの辞書(String key、それは、このプロパティは空のコレクションであるとき、まだ私はこのコレクションにカスタムプロパティを追加したら、私のオブジェクトグラフが細かいシリアライズ「ユーザーのプロパティ」

[DataMember] 
private Dictionary<string, Type> _UserPropertyDefinitions; 

のいずれかに設定された値を格納するObject値)コレクションDataContractSerializerでシリアル化しようとすると、次の例外が発生します。データ コントラクト名 と

タイプ 'System.RuntimeType' 'RuntimeType:http://schemas.datacontract.org/2004/07/System' が期待されていません。たとえば、 KnownTypeAttribute属性を使用するか、 を使用して、既知のタイプのリスト をDataContractSerializerに渡すなどして、既知の のタイプのリストに静的に知られているタイプを追加します( )。

このフィールドのDataMember属性を削除すると、例外が発生することなくシリアル化/逆シリアル化できますが、このフィールドで作成した設定は失われます。

+1

申し訳ありませんが遅延応答; - p Type.GetType()またはAssembly.GetType() –

答えて

7

私は、Typeが非常にうまくシリアライズするつもりはないと確信しています - とにかく、それはデータの主な目的の1つを打ち負かしているので-contract ...

はしかし、私は最善のアプローチはTypeAssemblyQualifiedNameまたはFullNameを使用して、Dictionary<string,string>のためにそれを交換することです期待しています。

+0

Geeze Marc実際の作業はありませんか? :-)しかし真剣に私は本当に助けに感謝します。だから、基本的には、型の名前を格納し、後で実際の型を名前から取得しますか? Typeの名前の検索方法はわかっていますが、後でTypeを取得するには名前を知るだけです –

+0

@Marc Gravell知られている農作物の種類でなければ名前を持っていればどのようにタイプを取得すればいいですか? あなたはまたアセンブリ全体をいくつか送るでしょうか? –

+0

@eranよく、AssemblyQualifiedNameは「ちょうど」名前ではありませんが、問題があります。特にアセンブリが異なる場合は問題があります。 2つの実装が既知の型を分類できる場合は、enumで十分でしょうか? protobuf-netでは、タイプIをシリアル化するために、タイプ<==>文字列の実装をユーザーに提供させるため、手動でマップすることができます。 –

関連する問題