我有以下代码片段用.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
答案 0 :(得分:1)
您的问题是您的data member order与XML中元素的顺序不一致。
如果数据协定类型是继承层次结构的一部分,则其基本类型的数据成员始终位于订单中。
接下来依次是当前类型的数据成员,它们没有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; }
}