Десериализация WCF, возвращающая 0 элементов списка - PullRequest
4 голосов
/ 26 января 2012

У меня возникли проблемы с десериализацией объекта.

У меня есть следующие классы:

Метаданные:

[DataContract]
public class MetadataStore : IEnumerable<ItemMetadata>
{
    private List<ItemMetadata> data = new List<ItemMetadata>();
    private string folderPath = null;

    [DataMember]        
    public string FilePath
    {
      // getter and setter
    }

    [DataMember]        
    public List<ItemMetadata> Data
    {
      // getter and setter
    }

}

ItemMetadata:

[Serializable()]
public class ItemMetadata
{
 // syncid, syncversion, uristring etc..
}

Проблема:

Я передаю объект Metadatastore с моего сервера (который имеетслужба wcf запущена) моему клиенту с помощью выходного параметра.Так что я полагаю, что сериализация / десериализация этого выходного параметра автоматически выполняется wcf.Вот что происходит:

клиент вызывает службу:

service.GetChangeBatch(out metadatastore_object, otherValue);

сервер отвечает правильно (metadatastore_object успешно заполнен и сериализован -> без ошибок)

объектЯ получаю на стороне клиента, хотя и не правильно: FilePath заполнен правильно, но объект List Data содержит ноль элементов!Я проверил также на сервере, и список данных содержал 2 элемента.Еще одна странная вещь, на которую следует обратить внимание, это то, что она не равна нулю, это только что созданный пустой список.Есть ли у кого-то опыт с этим, я могу предоставить больше кода, если это необходимо.Заранее спасибо.Встречает Даан

Ответы [ 4 ]

1 голос
/ 26 января 2012

Используйте CollectionDataContract вместо DataContract.

Здесь объяснение MSDN о CollectionDataContract: http://msdn.microsoft.com/en-us/library/aa347850.aspx

0 голосов
/ 26 января 2012

Вы также можете включить детальную регистрацию сообщений в сервисе wcf, чтобы увидеть, что SOAP xml возвращается с сервера.

Затем можно выяснить, не выполняет ли клиент десериализацию xml для объекта правильно или сервер неправильно сериализует объект в xml.

НТН

0 голосов
/ 26 января 2012

Класс ItemMetadata также должен быть оформлен как DataContract, чтобы клиент знал тип и способы его десериализации.

0 голосов
/ 26 января 2012

Это может быть строка:

 private List<ItemMetadata> data = new List<ItemMetadata>(); 

Это очищает ваш список.

Также я бы пометил ItemMetadata с DataContract и все свойства с DataMember.

...