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; } 
} 
相關問題