XML De/Serialization:如何为类的不同实例的相同属性定义不同的名称
Posted
技术标签:
【中文标题】XML De/Serialization:如何为类的不同实例的相同属性定义不同的名称【英文标题】:XML De/Serialization : How to define different name for same property of different instance of the class 【发布时间】: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 ?
谢谢
【问题讨论】:
使用不同的类?显然,他们不应该概括一些东西。 只是在黑暗中拍摄,您不要关闭<DataA>
和<DataB>
properly。这也在你的本地代码中吗?
@dba :不,这只是这篇文章中的一个错误;)
@Fildor :它是一个泛型类,只有 2 个我用于不同目的的属性。在我的示例中,我有 2 个列表,但我可以有 5、6 或更多。所以,如果可能的话,我不希望每次都创建一个新类而只创建一个。
嗯,通用模型创建通用 XML ...现在您可以做一些花哨的代码魔术,可能使用注释/属性,或者您序列化通用并运行重命名标签的后期制作 XSLT ... 总而言之,我个人会选择一个不错的模型。但如果这不是你的选择,那么你可能不得不接受这些警告。
【参考方案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->paste Special->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
【讨论】:
以上是关于XML De/Serialization:如何为类的不同实例的相同属性定义不同的名称的主要内容,如果未能解决你的问题,请参考以下文章