反序列化为对象
本文关键字:对象 反序列化 | 更新日期: 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; }
}
元素名称不适用于名称属性。