私はこのようなクラスをシリアライズしようとしています:
[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 に発行させることができるようになりました。しかし、問題は解決しません。何か案は?