Некоторые свойства не десериализуются с помощью DataContractSerializer

У меня проблема с DataContractSerializer. Я использую его для создания экземпляров класса из XML, возвращаемого веб-службой ASP.NET. Но на самом деле источник данных здесь не важен. Чтобы облегчить отладку всего дела, я создал простой тестовый проект с сериализацией, и проблема все еще возникает.

Вот мой XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<GetTestURL p1:type="MyApp.GetTestUrlInfo" xmlns:p1="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices">
  <TestURL>http://bing.com</TestURL>
  <UserCount p1:type="Edm.Int32">1</UserCount>
  <InitialCount p1:type="Edm.Int32">1</InitialCount>
  <AverageExecutionTime p1:type="Edm.Int32">43</AverageExecutionTime>
</GetTestURL>

Класс, я пытаюсь десериализовать XML:

[DataContract(Name = "GetTestURL", Namespace = "http://schemas.microsoft.com/ado/2007/08/dataservices")]
public class TestInfo
{
    [DataMember(Name = "TestURL")]
    public Uri TestUri { get; private set; }

    [DataMember(Name = "UserCount")]
    public int UserCount { get; private set; }

    [DataMember(Name = "InitialCount")]
    public int InitialCount { get; private set; }

    [DataMember(Name = "AverageExecutionTime")]
    public int AverageExecutionTime { get; private set; }
}

И мой вспомогательный класс сериализации:

public static class SerializationHelper<T>
{
    private static DataContractSerializer _serializer = new DataContractSerializer(typeof(T));

    public static T Deserialize(Stream source)
    {
        return (T)_serializer.ReadObject(source);
    }
}

Тестовый код:

// Test program
public static void Main()
{
    TestInfo info = null;
    using (var stream = File.Open("Input.xml", FileMode.Open, FileAccess.Read))
    {
        info = SerializationHelper<TestInfo>.Deserialize(stream);
    }
}

После установки brakepoint в конце метода я вижу следующее:

enter image description here

Как вы можете видеть, обе AverageExecutionTime и InitialCount не десериализованы и имеют значение int по умолчанию. Они должны установить 43 и 1, потому что эти значения находятся в XML.

Мне еще более странно, что свойство UserCount выполняется правильно, но на самом деле оно совсем не отличается от двух, которые не работают вообще. Единственное отличие - это имя элемента.

Ответ 1

Мне удалось заставить его работать, обновив контракт с данными. Что-то делать с порядком. Когда я сделал Uri требуемым свойством, он выбросил исключение, так что это может быть связано с порядком загрузки.

    [DataContract(Name = "GetTestURL", Namespace = "http://schemas.microsoft.com/ado/2007/08/dataservices")]
    public class TestInfo
    {
        public TestInfo() { }
        public TestInfo(Uri uri, int userCount, int initialCount, int averageExecutionTime)
        {
            TestUri = uri;
            UserCount = userCount;
            InitialCount = initialCount;
            AverageExecutionTime = averageExecutionTime;
        }
        [DataMember(Name = "TestURL", IsRequired=true, Order=1)]
        public Uri TestUri { get; private set; }

        [DataMember(Name = "UserCount", IsRequired=true, Order=2)]
        public int UserCount { get; private set; }

        [DataMember(Name = "InitialCount", IsRequired=true, Order=3)]
        public int InitialCount { get; private set; }

        [DataMember(Name = "AverageExecutionTime", IsRequired=true, Order=4)]
        public int AverageExecutionTime { get; private set; }
    }