Проблема десериализации WCF DataContract с пустыми значениями - PullRequest
3 голосов
/ 15 декабря 2010

Скажите, что у меня есть что-то вроде:

[DataContract(Namespace="http://bla.bla")]
public class MyClass {
    [DataMember] public long ResponseCode { get; set; }
    [DataMember] public long Fee { get; set; }
}

и из канала поступает следующее:

<ns0:MyResult>
    <ns2:ResponseCode xmlns:ns2="http://bla.bla">101</ns2:ResponseCode>
    <ns2:Fee xmlns:ns2="http://bla.bla"></ns2:Fee>
</ns0:MyResult>

Я получаю сообщение об ошибке:

---> System.Xml.XmlException: значение '' не может быть проанализировано как тип 'Int64'.----> System.FormatException: входная строка была в неправильном формате.

Я не понимаю, почему.Значение по умолчанию IsRequired для параметра DataContract равно false, поэтому я ожидаю, что оно будет десериализовано без ошибок и инициализирует отсутствующее значение значениями по умолчанию для типа (ноль).Чего мне не хватает?

1 Ответ

3 голосов
/ 15 декабря 2010

от - http://msdn.microsoft.com/en-us/library/aa347792.aspx

Взаимодействие с IsRequired

Как обсуждалось в Версии контракта данных, атрибут DataMemberAttribute имеет свойство IsRequired (по умолчанию установлено значение false). Свойство указывает, должен ли данный элемент данных присутствовать в сериализованных данных при их десериализации. Если для IsRequired задано значение true (что указывает на то, что значение должно присутствовать), а для EmitDefaultValue установлено значение false (это означает, что значение не должно присутствовать, если для него установлено значение по умолчанию), значения по умолчанию для этого элемента данных не могут быть сериализованный, потому что результаты будут противоречивыми. Если для такого элемента данных установлено значение по умолчанию (обычно ноль или ноль) и выполняется попытка сериализации, создается исключение SerializationException .

, а не ' данное значение элемента данных '

чтобы у вас был XML без элемента <ns2:Fee>, чтобы он работал

<ns0:MyResult>
    <ns2:ResponseCode xmlns:ns2="http://bla.bla">101</ns2:ResponseCode>
</ns0:MyResult>

Однако , я также ищу решение вашей проблемы. Как я могу заставить свой WCF перехватить это исключение и автоматически установить его значение по умолчанию для типа int или date.

Другая идея, если я попытаюсь следовать - используя i: nil = "true" -

<MyParentElement xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<MyElement i:nil="true"></MyElement>
</MyParentElement>

он должен иметь возможность установить пользовательское значение по умолчанию. Я не обязательно хочу, чтобы отсутствующий элемент от клиента указывал значение по умолчанию. Отсутствующий элемент также может означать, что клиент использует более старую версию контракта на данные.

...