在反序列化时重新映射单个标记

时间:2014-07-21 11:49:34

标签: c# xml serialization data-mapping

我重构了这样的代码:

public string CamelCASE { get; set; }

为:

public string CamelCase {get; set; }

只发现输入XML包含前一个外壳(让我们称之为喊叫骆驼)。我无法控制XML文档的生成方式。我也不愿意收回我的改变。

我想将喧嚣的骆驼属性映射到一个轻声细语中。

我已经尝试了 XmlElement XmlMapping ,但没有取得更大的成功。谷歌搜索只给我点击如何将内容映射到属性,沿this post行。但是,我只需要将< LoudCAMEL> 等内容反序列化为属性公共字符串QuietCamel

有没有顺利的方法呢?

修改

添加属性后如下:

using System.Collections.Generic;
using System.Xml;

public class Beep : SuperBeep
{
  private readonly BeepType _a;

  public Beep() { _a = BeepType.SomeSome; }
  public Beep(BeepType input) { _a = input; }
  ~Beep() { }
  public override void Dispose() { }

  public BeepType Aaa { get { return _a; } }

  [XmlElement("CamelCASE")]
  public bool CamelCase { get; set; }
}

我可以看到红色,波浪形的亮点告诉我由于其保护级别无法访问构造函数'XmlElement'。但是,当我编译时,我让IDE大声喊出'System.Xml.XmlElement'不是属性类

坦率地说,我对使用属性的建议(这是针对.NET 2.0)感到有点困惑,因为我的印象是版本3.5之前的.NET无法使用属性。我错了吗?

2 个答案:

答案 0 :(得分:5)

[XmlElement("CamelCASE")]
public string CamelCase { get; set; }
如果要在xml中保留shouty名称,那么

应该是您所需要的。如果要在 new xml中使用较安静的名称,但允许名称仍然有效,则会变得更复杂。你可以使用:

public string CamelCase { get; set; }

[XmlElement("CamelCASE"), Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public string CamelCaseLegacy {
    get { return CamelCase; }
    set { CamelCase = value; }
}
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeCamelCaseLegacy() { return false; }

序列化时,CamelCase属性将序列化为<CamelCase>,由于CamelCaseLegacy方法,ShouldSerialize*元素将被忽略。但是,当反序列化时,只要看到CamelCaseLegacy,就会使用<CamelCASE>属性。然后,我们将此值映射回CamelCase属性。

答案 1 :(得分:2)

您指的是错误的命名空间。

删除

using System.Xml;

并添加

using System.Xml.Serialization;