使用.NET Core中的DataContractSerializer反序列化XML时出现异常

时间:2017-06-29 09:48:08

标签: c# asp.net-core datacontractserializer

我有以下代码片段用.net core编写:

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位。&#39;元素&#39; &#39; SourceGuid&#39;从命名空间   &#39; http://mycompany.com/MyProduct/Operations&#39;不是预期的。期待   元素&#39; CreationTime&#39;

所以看起来,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 个答案:

答案 0 :(得分: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中元素的顺序必须是字母顺序,或者必须指定与{XML>中元素的实际顺序一致的DataMemberAttribute.Order值:

[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; }
}