XML反序列化忽略了按字母顺序排列的属性

时间:2016-03-03 13:18:29

标签: c# xml wcf serialization xml-deserialization

我有一个小问题 - XML反序列化完全忽略了不按字母顺序排列的项目。在示例对象(问题末尾的描述)中,Birthday节点在FirstName节点之后,并且在反序列化后被忽略并分配默认值。对于任何其他类型和名称都相同(我在CaseId类型的节点Guid后面有Patient类型的节点PatientInfo,并且在反序列化后它具有默认值)。

我在一个应用程序中使用下一个代码序列化它:

public static string SerializeToString(object data)
{
    if (data == null) return null;
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("", "");

    // what should the XmlWriter do?
    var settings = new XmlWriterSettings
    {
        OmitXmlDeclaration = true,
        NewLineChars = ""
    };

    using (var stringwriter = new System.IO.StringWriter())
    {
        // Use an XmlWriter to wrap the StringWriter
        using (var xmlWriter = XmlWriter.Create(stringwriter, settings))
        {
            var serializer = new XmlSerializer(data.GetType(), "");
            // serialize to the XmlWriter instance
            serializer.Serialize(xmlWriter, data, ns);
            return stringwriter.ToString();
        }
    }
}

这种方法被用来获得适当的结果作为WebMethod的论据(描述完整的问题here)。结果是这样的:

  

< PatientInfo><姓>富< /姓><生日> 2015-12-19T16:21:48.4009949 + 01:00< /生日>< RequestedClientID> 00000000-0000-0000-0000-000000000000&LT ; / RequestedClientID> 00000000-0000-0000-0000-000000000000< / patientId>< / PatientInfo>

此外,我还以简单的方式在另一个应用程序中反序列化

public static T Deserialize<T>(string xmlText)
{
    if (String.IsNullOrEmpty(xmlText)) return default(T);
    using (var stringReader = new StringReader(xmlText))
    {
        var serializer = new XmlSerializer(typeof(T));
        return (T)serializer.Deserialize(stringReader);
    }
}

示例对象:

[XmlRoot("PatientInfo")]
public class PatientInfo
{
    [XmlElement("FirstName")]
    public string FirstName { get; set; }
    [XmlElement("LastName")]
    public string LastName { get; set; }
    [XmlElement("SSN")]
    public string SSN { get; set; }
    [XmlElement("Birthday")]
    public DateTime? Birthday { get; set; }
    [XmlElement("RequestedClientID")]
    public Guid RequestedClientID { get; set; }
    [XmlElement("patientId")]
    public Guid patientId { get; set; }
}

所以,我想回答两个问题中的一个问题 - 1)如何调整序列化以使所有项目按字母顺序排列? 2)如何调整反序列化,因此不会忽略按字母顺序排列的项目?

感谢任何帮助。

更新

刚才想到,我使用的反序列化方法实际上并没有在我的问题中使用,因为我使用序列化信息作为WebMethod的数据,并且使用WCF的一些内部机制对其进行反序列化

1 个答案:

答案 0 :(得分:2)

WCF uses DataContractSerializer。此序列化程序对XML元素顺序很敏感,请参阅Data Member Order。没有disable this的快捷方式,而是需要将序列化程序替换为XmlSerializer

要执行此操作,请参阅Using the XmlSerializer Class,然后将[XmlSerializerFormat]应用于您的服务,例如:

[ServiceContract]
[XmlSerializerFormat]
public interface IPatientInfoService
{
    [OperationContract]
    public void ProcessPatientInfo(PatientInfo patient)
    {
        // Code not shown.
    }
}

[XmlRoot("PatientInfo")]
public class PatientInfo
{
    [XmlElement("FirstName")]
    public string FirstName { get; set; }
    [XmlElement("LastName")]
    public string LastName { get; set; }
    [XmlElement("SSN")]
    public string SSN { get; set; }
    [XmlElement("Birthday")]
    public DateTime? Birthday { get; set; }
    [XmlElement("RequestedClientID")]
    public Guid RequestedClientID { get; set; }
    [XmlElement("patientId")]
    public Guid patientId { get; set; }
}