【问题标题】:Serialize/Deserialize different property names?序列化/反序列化不同的属性名称?
【发布时间】:2013-10-09 04:15:32
【问题描述】:

我有一个旧系统,它在请求信息调用中返回 xml,其名称如下:

postalCodeField、firstNameField...

然后,同一个系统有一个修改调用,它采用如下所示的 xml:

邮政编码、拳头名、姓氏....

有没有办法构建一个对象来反序列化请求,但用不同的名称序列化 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
        .....
    }
}

有没有办法通过say属性把它们变成同一个对象?

编辑

有没有办法让一个对象在反序列化时接受一个标签名称,然后在序列化时输出一个不同的名称?

(反序列化为)myObj.MyTag(序列化为)

【问题讨论】:

    标签: c# xml serialization deserialization


    【解决方案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;
    }
    

    【讨论】:

      【解决方案2】:

      请务必注意您使用的是哪个实际的序列化程序。每个不同的序列化程序的工作方式都不同。

      我假设您使用的是System.Xml.Serialization.XmlSerializer。如果是这种情况,那么您希望像这样使用 System.Xml.Serialization 命名空间中的属性,例如 XmlElementAttribute:

      public class Person
      {
          [System.Xml.Serialization.XmlElement(ElementName = "firstNameField")]
          public string FirstName { get; set; }
      }
      

      这假定该字段是一个 XML 元素。如果是属性,请使用XmlAttribute 属性。

      【讨论】:

      • 是的,我正在使用该序列化程序并且我熟悉该属性,但是,虽然该属性允许我将标签反序列化为具有不同名称的属性,但它也会将该属性序列化为列出的属性姓名。因此,仅拥有该属性并不能解决我的问题。
      • 您可以在运行时添加该属性,仅在反序列化期间,使用 XmlAttributeOverrides。
      猜你喜欢
      • 1970-01-01
      • 2021-07-22
      • 2012-01-23
      • 2019-11-02
      • 1970-01-01
      • 2014-04-24
      • 2017-11-29
      • 2016-02-11
      相关资源
      最近更新 更多