Je l'extrait de code suivant écrit dans le noyau .net:Exception en désérialisation XML wtih DataContractSerializer dans .NET de base
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; }
}
}
Il émet une exception:
System.Runtime.Serialization.SerializationException: Erreur dans la ligne 1 position 86. 'Element' 'SourceGuid' de l'espace de noms 'http://mycompany.com/MyProduct/Operations' n'est pas attendu. élément attendant « CreationTime »
Il semble donc que, DataContractSerialized a raté une des propriétés. Donc, peut-il être bug dans l'implémentation .net de base de DataContractSerializer? Est-il possible de déboguer l'intérieur pour voir pourquoi cela arrive?
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>
noyau .net:
1.0.4