某些属性未使用DataContractSerializer进行反序列化

Mar*_*zek 10 c# datacontractserializer

我有问题DataContractSerializer.我用它从ASP.NET Web Service返回的XML创建类实例.但实际上数据来源在这里并不重要.为了使整个案例更容易调试,我创建了一个简单的测试项目,只是序列化,问题仍然存在.

这是我的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>
Run Code Online (Sandbox Code Playgroud)

我正在尝试将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; }
}
Run Code Online (Sandbox Code Playgroud)

和我的序列化助手类:

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

    public static T Deserialize(Stream source)
    {
        return (T)_serializer.ReadObject(source);
    }
}
Run Code Online (Sandbox Code Playgroud)

测试代码:

// 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在方法结束时设置制动点后,我看到如下:

在此输入图像描述

正如你所看到的,AverageExecutionTimeInitialCount不是反序列化,并有int默认值.它们应该设置为431,因为这些值在XML中.

对我来说更奇怪的是,UserCount财产是正确的,但实际上它与完全不起作用的两者完全没有区别.唯一不同的是元素名称.

Pat*_*ber 11

我设法通过更新数据合同让它工作.与订单有关.当我将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; }
    }
Run Code Online (Sandbox Code Playgroud)

  • @MarcinJuraszek`DataContractSerializer`根据文档[here](http://msdn.microsoft.com/en-us/library/ms729813.aspx)使用/期望XML中元素的严格排序.如果您的XML元素不会按照规则的默认顺序出现,那么您需要在`[DataMember]`属性中指定顺序,如Patrick的答案中所示. (4认同)