[英]Unable to serialize a derived class to XML
我正在尝试序列化以下类层次结构:
public class Control
{
public virtual string Name {get; set;}
public virtual string Type {get; set;}
public virtual string Text { get; set; }
public virtual SerializableFont Font { get; set; }
private Operation op = new Operation();
public Operation Events { get { return op; } }
}
[System.Xml.Serialization.XmlInclude(typeof(Control))]
public class TextProperties : Control
{
public Label txt;
public TextProperties()
{
}
public override string Type
{
get { return "Text"; }
}
public override string Text
{
get { return txt.Text; }
set
{
txt.Text = value;
}
}
public override SerializableFont Font
{
get { return new SerializableFont(txt.Font); }
set
{
txt.Font = new SerializableFont().Font ;
}
}
}
如您所见,我包含了基类,但仍然引发以下异常:
不应使用TextProperties类型。 使用XmlInclude或SoapInclude属性可以指定静态未知的类型。
我不确定问题确实出在您的类层次结构本身上,这似乎还可以。 您不需要添加属性。
相反,您可能尝试使用为控件类型创建的XmlSerializer读取/写入TextProperties类型的对象。 那行不通,您需要使用针对该类型创建的序列化器来进行序列化/反序列化。
如果在编译时未知,请尝试创建实现IXMLSerializable的包装类。 读取时,此类必须首先读取数据以定义包装对象的类(例如,名为“ TypeName”的节点属性)。 然后,它必须在运行时为给定类型创建特定的序列化器,并使用它加载包装的对象。
编辑:这是一些示例代码,如何完成。 您将需要自己实现GetTypeByName(例如,爬网所有已加载的程序集,或仅将某些字符串“硬接线”为所需的特定类型)。 该代码应足以集成到具有“ WrappedObject”属性的类中。
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
reader.MoveToContent();
var typeName = reader.GetAttribute("TypeName");
reader.ReadStartElement();
var serializer = new XmlSerializer(GetTypeByName(typeName));
WrappedObject = serializer.Deserialize(reader);
reader.ReadEndElement();
}
public void WriteXml(XmlWriter writer)
{
writer.WriteAttributeString("TypeName", "", GetTypeByName(WrappedObject));
var serializer = new XmlSerializer(typeof(WrappedObject));
serializer.Serialize(writer, WrappedObject);
}
我认为您需要像这样将属性放在父类之上
[XmlInclude(typeof(ChildClass))]
[Serializable]
public abstract class ParentClass
{
public abstract string Name { get; set; }
}
在儿童班上
[Serializable]
public class ChildClass: ParentClass
{
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.