C# - 反序列化一个抽象类(指定的类型是抽象的:name='ValueColorConverter', namespace='', at <ValueColorConverter xmlns=
Posted
技术标签:
【中文标题】C# - 反序列化一个抽象类(指定的类型是抽象的:name=\'ValueColorConverter\', namespace=\'\', at <ValueColorConverter xmlns=\'\'>。)【英文标题】:C# - Deserialize an abstract class (The specified type is abstract: name='ValueColorConverter', namespace='', at <ValueColorConverter xmlns=''>.)C# - 反序列化一个抽象类(指定的类型是抽象的:name='ValueColorConverter', namespace='', at <ValueColorConverter xmlns=''>。) 【发布时间】:2021-12-18 08:00:37 【问题描述】:我正在尝试反序列化一个抽象类并收到异常消息指定的类型是抽象的:name='ValueColorConverter', namespace='', at
void Main()
// <ValueColorConverter xsi:Type="ValueColorConverter_Band" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
XElement config = XElement.Parse(@"<ValueColorConverter xsi:Type=""ValueColorConverter_Band"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""/>");
XmlSerializer xs = new XmlSerializer(typeof(ValueColorConverter));
var vcc = xs.Deserialize(config.CreateReader()) as ValueColorConverter;
[Serializable]
[XmlInclude(typeof(ValueColorConverter_Band))]
[XmlInclude(typeof(ValueColorConverter_Gradient))]
public abstract class ValueColorConverter
public abstract string Convert(double value);
[Serializable]
public class ValueColorConverter_Band : ValueColorConverter
public override string Convert(double value)
//doo work
return "";
[Serializable]
public class ValueColorConverter_Gradient : ValueColorConverter
public override string Convert(double value)
//doo work
return "";
我见过许多使用命名空间的解决方案,但我无法将它们调整为在没有命名空间的情况下使用。
【问题讨论】:
【参考方案1】:你必须反序列化成一个具体的类,这里是 ValueColorConverter_Gradient。然后您可以将对象分配给 ValueColorConverter 类型的变量。
【讨论】:
有没有比检查 xml 以确定它是哪个派生类型更好的方法? 我尝试将 ValueColorConverter 更改为常规类(已删除抽象),虽然 Deserialize 确实可以正常工作,但它仍然返回 ValueColorConverter 对象而不是指定的派生类。【参考方案2】:嗯,我想通了。 这个问题原来是 XML 中的一个错字。 'xsi:type' 需要有一个小写的 't'。然后它将反序列化为派生类型。
【讨论】:
请选择这个作为正确答案以上是关于C# - 反序列化一个抽象类(指定的类型是抽象的:name='ValueColorConverter', namespace='', at <ValueColorConverter xmlns=的主要内容,如果未能解决你的问题,请参考以下文章
Jackson Faster XML:如何解析抽象类'孩子?混入?