DataContractJsonSerializer: сериализация класса со свойством интерфейса - PullRequest
2 голосов
/ 22 марта 2011

Я пытаюсь сериализовать класс следующим образом:

[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. Но проблема сохраняется. Есть идеи?

1 Ответ

0 голосов
/ 22 марта 2011

В моем опыте с DataContractJsonSerializer и десериализацией сложных объектов (в окнах) вам необходимо включить подсказки __type для правильной работы десериализации.

Мой опыт работы с DataContractJsonSerializer отправляет JSON вуслуга WCF

...