2

私はこのようなクラスをシリアライズしようとしています:

[DataContract]
public class GenericFlow 
{
    [DataMember]
    public ISource Source { get; set; }
    [DataMember]
    public IList<IFilter> Filters { get; set; }
}

このオブジェクトのインスタンスをシリアル化すると、すべてがうまくいきますが、逆シリアル化しようとするとエラーが発生します。テストに Mono 2.6 を使用しています。これは mono プラットフォームでのエラーです。

Stacktrace:


Native stacktrace:

    /usr/bin/mono() [0x48563b]
    /usr/bin/mono() [0x4d275f]
    /lib/libpthread.so.0(+0xfb40) [0x7fd5f8d6eb40]
    /usr/bin/mono(mono_object_get_virtual_method+0x174) [0x4f5744]
    /usr/bin/mono() [0x555524]
    [0x41632228]

Debug info from gdb:

Source プロパティから DataMember 属性を削除すると、逆シリアル化が機能します。

シリアル化中に生成された json 文字列を見ると、フィルター リストの各項目に、IFilter を実装する具象クラスを指定する「__type」属性が含まれていることがわかります。しかし、プロパティ「__type」が欠落しているタイプ ISource のプロパティ「Source」には当てはまらないため、逆シリアル化プロセスは、どの具象クラスを使用してプロパティを再作成するかを認識しません。

Windows ボックスが手元にないので、これがモノ特有の問題なのか、それともここに何かが欠けているのかわかりません。

Source プロパティに "__type" 属性を含めるように DataContractJsonSerializer に指示するにはどうすればよいですか?

前もって感謝します、

アップデート:

もう少し調査すると、alwaysEmitTypeInformation=true でコンストラクターを呼び出す型情報を常に DataContractJsonSerializer に発行させることができるようになりました。しかし、問題は解決しません。何か案は?

4

1 に答える 1

0

DataContractJsonSerializer と複雑なオブジェクト (Windows 上) の逆シリアル化に関する私の経験では、逆シリアル化が適切に機能するために __type ヒントを含める必要があります。

私の DataContractJsonSerializer エクスペリエンスは、JSON を WCF サービスに送信しています

于 2011-03-22T18:29:48.290 に答える