反序列化为对象

本文关键字:对象 反序列化 | 更新日期: 2023-09-27 17:56:52

我正在尝试将XML反序列化为C#对象。

我的 XML 是:

<StaffingOrder xmlns='StaffinfOrderNamespace' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <OrderId idOwner="VMSAccess">
      <IdValue name='RequisitionID'>1</IdValue>
      <IdValue name='KellyBranch'>3319</IdValue>
   </OrderId>
</StaffingOrder>

我的班级是:

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[XmlRoot("StaffingOrder")]
public class OrderId
{
    [XmlElement(ElementName = "RequisitionID")]
    public int RequisitionID { get; set; }
    [XmlElement(ElementName = "KellyBranch")]
    public int KellyBranch { get; set; }
}

我的 WCF 服务合同是:

 [OperationContract]
 [WebInvoke(Method = "POST", UriTemplate = "UploadOrderDocument",
            RequestFormat = WebMessageFormat.Xml, 
            ResponseFormat = WebMessageFormat.Xml,
            BodyStyle = WebMessageBodyStyle.Bare)]
 [XmlSerializerFormat]
 OrderId UploadOrderDocument(string hrXML);

我正在尝试反序列化为:

public OrderId UploadOrderDocument(string hrXMLString)
{
    OrderId orderId = new OrderId();
    using (StringReader sr = new StringReader(hrXMLString))
    {
        XmlSerializer xs = new XmlSerializer(typeof(OrderId));
        orderId = (OrderId)xs.Deserialize(sr);
        var temp = orderId.RequisitionID;
    }
    return orderId;
}

我在反序列化时没有收到任何错误,但没有得到任何 RequisitionID 值。

反序列化为对象

您的类似乎与您尝试反序列化的 XML 没有太多相似之处。 如果要从已创建的类创建 XML,它将如下所示:

<StaffingOrder>
    <RequisitionID>1</RequisitionID>
    <KellyBranch>3319</KellyBranch>
</StaffingOrder>

你想要的是实际表示 XML 结构的类:

[XmlRoot(Namespace = "StaffinfOrderNamespace")]
public class StaffingOrder
{    
    public OrderId OrderId { get; set; }    
}
public class OrderId
{
    [XmlAttribute("idOwner")]
    public string IdOwner { get; set; }
    [XmlElement("IdValue")]
    public List<IdValue> IdValues { get; set; }
}
public class IdValue
{
    [XmlAttribute("name")]
    public string Name { get; set; }
    [XmlText]
    public int Value { get; set; }
}

请参阅此小提琴以获取工作演示。

有两种

方法可以做到这一点,一种是像 Charles 提到的那样更改类,另一种是实现 IXmlSerializable 并实现您自己的序列化逻辑。

IXmlSerializable 的另一个优点是,如果 XML 结构在此过程中的某个位置发生更改,则可以更改该实现,而不必更改类的结构。

你实际拥有的是这个对象

public class OrderId
{
    [XmlElement]
    public IEnumerable<int> IdValue { get; set; }
}

元素名称不适用于名称属性。