XML序列化:根据属性值实例化派生类
本文关键字:实例化 派生 属性 序列化 XML | 更新日期: 2023-09-27 18:18:14
关于XML序列化还有一个问题。我有一个Base
类,我有继承自它的Derived1
和Derived2
类。我想从xml元素<base>
反序列化它们,如果<base attr="1">
,我想创建Derived1
实例,如果<base attr="2">
,我想创建Derived2
实例。我该怎么做呢?请注意,我使用XmlSerializes
和XmlAttributeOverrides
。谢谢你
编辑:我完全修改了我的答案,以适应你的确切情况。假设您已经正确地序列化了Base列表,下面的代码应该可以工作了。
我通常不建议使用switch语句,因为它违反了OCP。多态通常是一个更好的答案。但是对于一个快速和肮脏的解决方案,以及一个值相对较少的switch语句(像您的情况),这将工作。重要提示:假设序列化正确,XML序列化器将已经反序列化到正确的派生类。但是,如果由于某种原因,您的情况不是这样,那么您需要剩下的代码(foreach with switch语句)。
private static void ImportDerivedClasses()
{
List<Base> bases;
string filePathAndName = @"c:'temp'SerializedBases.xml";
using (FileStream fileStream = new FileStream(filePathAndName, FileMode.Open))
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Base>));
bases = xmlSerializer.Deserialize(fileStream) as List<Base>;
}
// The rest of this is unnecessary if we originally serialized correctly.
List<Base> deserializedBases = new List<Base>();
foreach(Base baseClass in bases)
{
switch (baseClass.Attr)
{
case "1":
deserializedBases.Add(new Derived1());
break;
case "2":
deserializedBases.Add(new Derived2());
break;
default:
// Log warning
break;
}
}
}