我有一个旧系统,它在请求信息调用中返回xml,其名称如下所示:
postalCodeField,firstNameField ...
然后同一个系统有一个修改调用,它需要xml,如下所示:
PostalCode,fistName,lastName ....
有没有办法构建一个反序列化请求的对象,但是用不同的名称序列化xml输出?
具体做法是:
public class RequestInfo
{
public string firstNameField{get;set;}
public string lastNameField{get;set;}
}
public class ModifyInfo
{
public string firstName{get;set;}
public string lastName{get;set;}
public ModifyInfo(){}
public ModifyInfo(RequestInfo ri)
{
firstName = ri.firstNameField
.....
}
}
是否有通过声明属性的方法将这些属性转换为同一个对象?
修改
有没有办法让一个对象在反序列化时接受一个标记名,然后在序列化上输出一个不同的名称?
< myTagField /> (反序列化)myObj.MyTag(序列化为)< MyTag />
答案 0 :(得分:5)
请注意您正在使用的实际序列化程序。每个不同的序列化程序的工作方式都不同。
我假设你正在使用System.Xml.Serialization.XmlSerializer
。如果是这种情况,那么您希望使用System.Xml.Serialization
命名空间中的属性,例如XmlElementAttribute,如下所示:
public class Person
{
[System.Xml.Serialization.XmlElement(ElementName = "firstNameField")]
public string FirstName { get; set; }
}
这假定该字段是XML元素。如果是属性,请使用XmlAttribute
属性。
答案 1 :(得分:1)
在MSDN上查看Attributes That Control XML Serialization。您将需要XmlElement用于属性,并且可能需要XmlRoot用于根类。
如果只需要在反序列化期间覆盖属性名称,那么可以使用XmlAttributeOverrides动态定义属性:
public XmlSerializer CreateOverrider()
{
XmlElementAttribute xElement = new XmlElementAttribute();
xElement.ElementName = "firstName";
XmlAttributes xElements = new XmlAttributes();
xElements.XmlElements.Add(xElement);
XmlAttributeOverrides xOver = new XmlAttributeOverrides();
xOver.Add(typeof(RequestInfo), "firstNameField", xElements);
XmlSerializer xSer = new XmlSerializer(typeof(RequestInfo), xOver);
return xSer;
}