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

本文关键字:映射 单个标 新映射 反序列化 | 更新日期: 2023-09-27 18:14:07

我重构了如下代码:

public string CamelCASE { get; set; }

至:

public string CamelCase {get; set; }

只发现输入XML包含前一个大小写(让我们称之为呐喊骆驼(。我无法控制XML文档的生成方式。我也不想收回我的改变。

我想把声音洪亮的骆驼庄园映射成一个说话轻声细语的庄园。

我尝试过XmlElementXmlMapping,但没有取得更大的成功。谷歌搜索只给了我关于如何将内容映射到属性的点击,就像这篇文章一样。然而,我只需要像<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会大声喊出的系统。Xml。XmlElement"不是属性类

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

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

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

如果您将shouty名称保留在xml中,则应该是您所需要的全部。如果您想在newxml中使用更安静的名称,但允许名称仍然有效,则会变得更复杂。您可以使用:

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*方法而被忽略。但是,当反序列化时,只要看到<CamelCASE>,就会使用CamelCaseLegacy属性。然后,我们将该值映射回CamelCase属性。

您引用了错误的命名空间。

删除

using System.Xml;

并添加

using System.Xml.Serialization;