Я пытаюсь сериализовать класс следующим образом:
[DataContract]
public class GenericFlow
{
[DataMember]
public ISource Source { get; set; }
[DataMember]
public IList<IFilter> Filters { get; set; }
}
Когда я отделяю экземпляр этого объекта, все идет хорошо, но если я пытаюсь десериализовать, я получаю ошибку. Я использую Mono 2.6 для своих тестов, это ошибка на моно платформе:
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:
Если я удалю атрибут DataMember из свойства источника, десериализация будет работать.
Взглянув на строку json, созданную во время сериализации, я вижу, что каждый элемент в списке фильтров содержит атрибут "__type", указывающий конкретный класс, который реализует IFilter. Но это не так со свойством «Source» типа ISource, где свойство «__type» отсутствует, поэтому процесс десаризации не знает, какой конкретный класс используется для воссоздания свойства.
Так как у меня нет удобного окна, я не знаю, является ли это моно-специфической проблемой, или, может быть, я что-то здесь упускаю.
Как мне указать DataContractJsonSerializer включить атрибут "__type" в свойство источника?
Заранее спасибо,
UPDATE:
Изучая немного больше, теперь я могу заставить DataContractJsonSerializer всегда выдавать информацию о типе, вызывая конструктор с AlwaysEmitTypeInformation = true.
Но проблема сохраняется. Есть идеи?