2017-06-29 105 views
1

我有下面的代码片段写在.NET的核心:异常反序列化XML wtih的DataContractSerializer在.NET核心

using System; 
using System.Runtime.Serialization; 
using System.Text; 
using System.Xml; 

namespace BugTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Hello World!"); 

      var xml = @"<PingDataConfirmation xmlns=""http://mycompany.com/MyProduct/Operations""> 
     <SourceGuid>88c02aba-f78c-4749-8665-0caddee08b8a</SourceGuid> 
     <Guid>88c02aba-f78c-4749-8665-0caddee08b8a</Guid> 
     <CreationTime>0001-01-01T00:00:00</CreationTime> 
     </PingDataConfirmation>"; 

      const int buffSize = 1000000; 

      int bytes = 0; 
      int chars = 0; 
      byte[] result = new byte[buffSize]; 
      bool compl; 
      Encoding.UTF8.GetEncoder().Convert(xml.ToCharArray(), 0, xml.Length, result, 0, buffSize, true, out chars, out bytes, out compl); 

      var xmlReader = XmlDictionaryReader.CreateTextReader(result, 0, bytes, new XmlDictionaryReaderQuotas()); 
      var sr = new DataContractSerializer(typeof(PingDataConfirmation)); 
      var deserialized = sr.ReadObject(xmlReader); 
     } 
    } 

    [DataContract(Namespace = "http://mycompany.com/MyProduct/Operations")] 
    public class PingDataConfirmation 
    { 
     [DataMember(IsRequired = true)] 
     public string SourceGuid { get; set; } 

     [DataMember(IsRequired = true)] 
     public string Guid { get; set; } 

     [DataMember(IsRequired = true)] 
     public DateTime CreationTime { get; set; } 
    } 
} 

它抛出异常:

System.Runtime.Serialization.SerializationException:错误在行1 位置86.来自命名空间 'http://mycompany.com/MyProduct/Operations'的元素'SourceGuid'不是预期的。期待 元素'CreationTime'

所以看起来,DataContractSerialized已经错过了其中一个属性。

那么,DataContractSerializer的.net核心实现可能是错误吗?有没有可能调试内部,看看它为什么会发生?

的csproj:

<Project Sdk="Microsoft.NET.Sdk"> 
    <PropertyGroup> 
    <OutputType>Exe</OutputType> 
    <TargetFramework>netcoreapp1.1</TargetFramework> 
    </PropertyGroup> 
    <ItemGroup> 
    <PackageReference Include="System.ServiceModel.Primitives" Version="*" /> 
    <PackageReference Include="System.ServiceModel.Http" Version="*" /> 
    </ItemGroup> 
</Project> 

.NET的核心:

1.0.4 

回答

1

你的问题是,你的data member order是在XML元素的顺序不一致。

Data Member Order

  • 如果数据合同类型是继承层次结构的一个组成部分,它的基本类型的数据成员总是首先在顺序。

  • 接下来是顺序是当前类型的数据成员没有DataMemberAttribute属性集的Order属性,按 字母顺序排列。

  • 接下来是具有DataMemberAttribute属性集的Order属性的任何数据成员。这些按价值 Order属性排序,然后按字母顺序排列,如果有多个 的值,则该值为某个Order的值。订单值可能会跳过 。

而且从Data Contract Equivalence: Data Member Order and Data Contract equivalence

请记住,数据成员的顺序必须匹配,并且 基本类型成员在之前的顺序派生类型的成员。

因此无论是在XML元素的顺序必须是字母,或DataMemberAttribute.Order值必须被指定是具有元素在XML的实际顺序是一致的:

[DataContract(Namespace = "http://mycompany.com/MyProduct/Operations")] 
public class PingDataConfirmation 
{ 
    [DataMember(IsRequired = true, Order = 1)] 
    public string SourceGuid { get; set; } 

    [DataMember(IsRequired = true, Order = 2)] 
    public string Guid { get; set; } 

    [DataMember(IsRequired = true, Order = 3)] 
    public DateTime CreationTime { get; set; } 
}