【问题标题】:XML De/Serialization : How to define different name for same property of different instance of the classXML De/Serialization:如何为类的不同实例的相同属性定义不同的名称
【发布时间】:2021-11-24 21:41:44
【问题描述】:

我正在尝试序列化包含同一对象的两个列表的对象。

public class Foo
{
   public List<ClassA> DataA {get;set;}
   public List<ClassA> DataB {get;set;}
}

public class ClassA
{
  public string Code {get;set;}
  public string Value {get;set;}
}

在 xml 文件中,我希望类的属性具有不同的名称。像这样:

<Foo>
  <DataA>
    <ClassA>
      <Code></Code>
      <Value></Value>
    </ClassA>
  </DataA>
  <DataB>
    <ClassA>
      <Name></Name>
      <Text></Text>
    </ClassA>
  </DataB>
</Foo>

我尝试使用“XmlAttributeOverrides”,但属性名称已针对所有实例进行了修改,而不仅仅是一个。

有没有办法做到这一点?也许是自定义 XmlSerializer ?

谢谢

【问题讨论】:

  • 使用不同的类?显然,他们不应该概括一些东西。
  • 只是在黑暗中拍摄,您不要关闭&lt;DataA&gt;&lt;DataB&gt;properly。这也在你的本地代码中吗?
  • @dba :不,这只是这篇文章中的一个错误;)
  • @Fildor :它是一个泛型类,只有 2 个我用于不同目的的属性。在我的示例中,我有 2 个列表,但我可以有 5、6 或更多。所以,如果可能的话,我不希望每次都创建一个新类而只创建一个。
  • 嗯,通用模型创建通用 XML ...现在您可以做一些花哨的代码魔术,可能使用注释/属性,或者您序列化通用并运行重命名标签的后期制作 XSLT ... 总而言之,我个人会选择一个不错的模型。但如果这不是你的选择,那么你可能不得不接受这些警告。

标签: c# xml serialization


【解决方案1】:

将输入的 XML 复制到剪贴板中

<Foo>
  <DataA>
    <ClassA>
      <Code></Code>
      <Value></Value>
    </ClassA>
    <ClassA>
      <Code></Code>
      <Value></Value>
    </ClassA>
  </DataA>
  <DataB>
    <ClassA>
      <Name></Name>
      <Text></Text>
    </ClassA>
    <ClassA>
        <Code></Code>
        <Value></Value>
    </ClassA>
  </DataB>
</Foo>

并在 Visual Studio 中为您的项目添加一个新的类文件。 选择并清除命名空间内新创建文件的所有内容并使用Edit-&gt;paste Special-&gt;insert XML as code(或类似的东西,我有一个德语IDE)

应该给你这样的东西(经过一些重组)

namespace SandBoxApp
{

  // HINWEIS: Für den generierten Code ist möglicherweise mindestens .NET Framework 4.5 oder .NET Core/Standard 2.0 erforderlich.
  /// <remarks/>
  [System.SerializableAttribute()]
  [System.ComponentModel.DesignerCategoryAttribute("code")]
  [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
  [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
  public partial class Foo
  {

    private FooClassA[] dataAField;

    private FooClassA[] dataBField;

    /// <remarks/>
    [System.Xml.Serialization.XmlArrayItemAttribute("ClassA", IsNullable = false)]
    public FooClassA[] DataA
    {
      get
      {
        return this.dataAField;
      }
      set
      {
        this.dataAField = value;
      }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlArrayItemAttribute("ClassA", IsNullable = false)]
    public FooClassA[] DataB
    {
      get
      {
        return this.dataBField;
      }
      set
      {
        this.dataBField = value;
      }
    }
  }

  /// <remarks/>
  [System.SerializableAttribute()]
  [System.ComponentModel.DesignerCategoryAttribute("code")]
  [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
  public partial class FooClassA
  {

    private object codeField;

    private object valueField;

    /// <remarks/>
    public object Code
    {
      get
      {
        return this.codeField;
      }
      set
      {
        this.codeField = value;
      }
    }

    /// <remarks/>
    public object Value
    {
      get
      {
        return this.valueField;
      }
      set
      {
        this.valueField = value;
      }
    }
  }

您可能希望根据自己的需求进行重构,但它应该为您指明方向。

总结一下,我觉得你错过了属性:

 [System.Xml.Serialization.XmlArrayItemAttribute("ClassA", IsNullable = false)]

在你的清单上-Pperties

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多