序列化/反序列化不同的属性名称?

时间:2013-10-02 17:07:17

标签: c# xml serialization deserialization

我有一个旧系统,它在请求信息调用中返回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 />

2 个答案:

答案 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;
}