Csharp/C#教程:XML序列化类具有隐藏inheritance成员的新属性分享


XML序列化类具有隐藏inheritance成员的新属性

我有以下抽象类结构:

public abstract class Template { // Some properties and methods defined } public abstract class Template : Template where TTemplate : Template { // No new properties defined, but methods overriden } 

然后我将这些模板类用作模型的一部分:

 public abstract class Model { public Template Template {get;set;} public Model(Template t) {Template = t;} // More properties and methods } public abstract class Model : Model where TModel : Model where TTemplate : Template { public new TTemplate template {get {return (TTemplate)base.Template;} set {base.Template = value;}} public Model(TTemplate t) : base(t) {} // Override some methods but no new properties } 

然后我创建我的模板和模型的具体类,并在我的项目中使用它们。 这些具体类定义了除抽象基类中指定的属性之外的其他属性。 是时候序列化Model类了。 我使用reflection来查找所有inheritance的Model或Template类型,并将它们传递给XmlSerializer,以便它可以正确地序列化我的抽象类。 但是,我得到了一个例外

 There was an error reflecting type 'ConcreteModel'. ---> System.InvalidOperationException: There was an error reflecting property 'Template'. ---> System.InvalidOperationException: Member ModelOfConcreteModelConcreteTemplate.Template of type ConcreteTemplate hides base class member Model.Template of type Template. Use XmlElementAttribute or XmlAttributeAttribute to specify a new name. 

我在2003 年的谷歌小组中发现了这篇post,其中声称给出了答案,但我不确定如何实施该修复(或者如果它在13年后甚至有效)。 它确实表明错误消息具有误导性,因为消息提出的解决方案不起作用。

如果我从Model.Template中删除’set’访问器并键入Model类(例如,只通过构造函数设置它),那么类序列化就好了 – 尽管没有Template属性。 有没有办法XML序列化类来隐藏(n)(抽象)基类的属性,而不是在每个inheritance的类上实现IXmlSerializable?

我通过david.woodward发现了这篇文章 ,展示了一种可行的和on-the-rails方法来处理这种情况(即,当更改基类不是一个选项时)。 它建议为XmlSerializer提供XmlAttributeOverrides

使用您提供的对象模型,以下代码说明了它的用法。 它的工作原理是明确告诉XmlSerializer忽略基类中的隐藏属性,在本例中为Model.Template

上述就是C#学习教程:XML序列化类具有隐藏inheritance成员的新属性分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 using System; using System.IO; using System.Text; using System.Xml.Serialization; class Program { static void Main(string[] args) { ConcreteTemplate ct = new ConcreteTemplate() { SomeProperty = "hello" }; ConcreteGenericModel cgm = new ConcreteGenericModel(ct); XmlAttributeOverrides attrOverides = new XmlAttributeOverrides(); XmlAttributes attrs = new XmlAttributes() { XmlIgnore = true }; attrOverides.Add(typeof(Model), "Template", attrs); Type[] extraTypes = new Type[0]; XmlSerializer serializer = new XmlSerializer(typeof(ConcreteGenericModel), attrOverides, extraTypes, null, null); StringBuilder sb = new StringBuilder(); using (StringWriter writer = new StringWriter(sb)) serializer.Serialize(writer, cgm); string serializedClass = sb.ToString(); Console.WriteLine(serializedClass); ConcreteGenericModel deserializedCgm; using (StringReader reader = new StringReader(serializedClass)) deserializedCgm = (ConcreteGenericModel)serializer.Deserialize(reader); Console.ReadLine(); } } public abstract class Template { // Some properties and methods defined public virtual string SomeProperty { get; set; } } public abstract class Template : Template where TTemplate : Template { // No new properties defined, but methods overriden } public class ConcreteTemplate : Template { } public abstract class Model { public Model() { } public Template Template { get; set; } public Model(Template t) { Template = t; } // More properties and methods } public class ConcreteModel : Model { public ConcreteModel(Template t) : base(t) { } } public abstract class Model : Model where TModel : Model where TTemplate : Template { public Model() { } public new TTemplate Template { get { return (TTemplate)base.Template; } set { base.Template = value; } } public Model(TTemplate t) : base(t) { } // Override some methods but no new properties } public class ConcreteGenericModel : Model { public ConcreteGenericModel() { } public ConcreteGenericModel(ConcreteTemplate t) : base(t) { } } 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/986673.html

(0)
上一篇 2021年12月22日
下一篇 2021年12月22日

精彩推荐