繁体   English   中英

DataContract不会反序列化ID DataMember

[英]DataContract won't deserialize Id DataMember

使用DataContract序列化程序时,它无法反序列化Id值,如以下示例所示:

using System;
using System.Runtime.Serialization;
using System.Xml.Linq;

public class Program
{
    private const string SAMPLE_VALIDATION_RESULT_XML = @"    <ValidationResult>
      <Message>The FooBar record has duplicate key values.</Message>
      <Id>Microsoft.LightSwitch.EntityObject.DuplicateKey</Id>
      <Target>http://localhost:55815/ApplicationData.svc/FooBar(0)</Target>
    </ValidationResult>";

    [DataContract(Name = "ValidationResult", Namespace = "")]
    public class ValidationResult
    {
        [DataMember]
        public string Message { get; set; }
        [DataMember]
        public string Id { get; set; }
        [DataMember]
        public string Target { get; set; }
    }


    public static void Main()
    {
        var doc = XDocument.Parse(SAMPLE_VALIDATION_RESULT_XML);
        using (var reader = doc.CreateReader())
        {
            reader.MoveToContent();
            var res = (new DataContractSerializer(typeof(ValidationResult))).ReadObject(reader) as ValidationResult;
            Console.WriteLine($"res.Id = \"{res.Id}\", expected \"Microsoft.LightSwitch.EntityObject.DuplicateKey\"");
        }
    }
}

我猜想这与参照完整性功能有关,但我只发现了一个禁用它的选项(在DataContractSerializer上),并且它不影响结果。

我无法更改Id字段的名称,因为它是第三方API,那么如何访问该值?

指定成员顺序

[DataContract(Name = "ValidationResult", Namespace = "")]
public class ValidationResult
{
    [DataMember(Order = 0)]
    public string Message { get; set; }
    [DataMember(Order = 1)]
    public string Id { get; set; }
    [DataMember(Order = 2)]
    public string Target { get; set; }
}

如果不指定顺序,则DataContractSerializer期望成员将按字母顺序排列。 请参阅基本规则 很明显,服务提供商建立了订单。 因此,您必须指定它。

改用它。 XmlSerializer不在乎顺序。

var xml = new XmlSerializer(typeof(ValidationResult));
var res = (ValidationResult)xml.Deserialize(reader);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM