2013-11-14 33 views
10

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

这里是我的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

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

对我来说更加奇怪的是,UserCount属性做得不错,但实际上它根本不起作用。唯一不同的是元素名称。

+0

可能重复http://stackoverflow.com/questions/15413468/deserializing-xml-with-datacontractserializer?rq=1 –

回答

10

我设法通过更新数据合同来实现它。与订单有关。当我让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; } 
    } 
+0

你有任何想法,为什么它不无'Order' /'工作IsRequired' ? – MarcinJuraszek

+1

@MarcinJuraszek我做了两个测试, 删除了所有的IsRequired和Order属性,并改变了输入xml以按字母顺序排列元素。 *工作* 删除了IsRequired并保持原样。 *工作* 它似乎序列化程序正在使用您的类流读取文档。如果您没有指定顺序,则不知道按照正确顺序查找元素。默认情况下,使用的顺序是按字母顺序排列 –

+4

@MarcinJuraszek DataContractSerializer使用/期望按照文档[这里](http://msdn.microsoft.com/en-us/library/ms729813.aspx)在XML中严格排列元素。如果您的XML元素不会按照规则的默认顺序显示,那么您需要在Patrick's答案中显示的'[DataMember]'属性中指定顺序。 –

相关问题