C# 序列化/反序列化不同的属性名称?
我有一个旧系统,它在请求信息调用中返回xml,其名称如下: postalCodeField,firstNameField 然后,同一个系统有一个modify调用,该调用接受如下xml: PostalCode、fistName、lastName 有没有一种方法可以构建一个反序列化请求的对象,同时用不同的名称序列化xml输出 具体而言:C# 序列化/反序列化不同的属性名称?,c#,xml,serialization,deserialization,C#,Xml,Serialization,Deserialization,我有一个旧系统,它在请求信息调用中返回xml,其名称如下: postalCodeField,firstNameField 然后,同一个系统有一个modify调用,该调用接受如下xml: PostalCode、fistName、lastName 有没有一种方法可以构建一个反序列化请求的对象,同时用不同的名称序列化xml输出 具体而言: public class RequestInfo { public string firstNameField{get;set;} public s
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
.....
}
}
有没有一种方法可以通过这些属性使它们成为同一个对象
编辑
有没有办法让一个对象在反序列化时接受一个标记名,然后在序列化时输出另一个名称
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;
}
查看MSDN。属性需要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;
}
请务必注意您正在使用的实际序列化程序。每个不同的序列化程序的工作方式都不同 我假设您使用的是
System.Xml.Serialization.XmlSerializer
。如果是这种情况,那么您希望使用System.Xml.Serialization
命名空间中的属性,例如XmlElementAttribute,如下所示:
public class Person
{
[System.Xml.Serialization.XmlElement(ElementName = "firstNameField")]
public string FirstName { get; set; }
}
这假定字段是XML元素。如果它是一个属性,请使用
xmldattribute
属性。注意您正在使用的实际序列化程序很重要。每个不同的序列化程序的工作方式都不同
我假设您使用的是System.Xml.Serialization.XmlSerializer
。如果是这种情况,那么您希望使用System.Xml.Serialization
命名空间中的属性,例如XmlElementAttribute,如下所示:
public class Person
{
[System.Xml.Serialization.XmlElement(ElementName = "firstNameField")]
public string FirstName { get; set; }
}
这假定字段是XML元素。如果它是一个属性,请使用
xmldattribute
属性。是的,我正在使用该序列化程序,并且我熟悉该属性,但是,虽然该属性允许我将标记反序列化为具有不同名称的属性,但它也将该属性序列化为列出的属性名称。因此,仅使用该属性无法解决我的问题。您可以在运行时仅在反序列化期间使用XmlAttributeOverrides添加该属性。是的,我正在使用该序列化程序,并且我熟悉该属性,但是,该属性允许我将标记反序列化为具有不同名称的属性,它还将该属性序列化为列出的属性名称。因此,仅使用该属性无法解决我的问题。您可以在运行时使用XmlAttributeOverrides在反序列化期间添加该属性。