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 。 em>

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=的主要内容,如果未能解决你的问题,请参考以下文章

C# 知识点总结

Jackson Faster XML:如何解析抽象类'孩子?混入?

反序列化抽象类

Gson关于抽象类的序列化与反序列化

是否有一种开箱即用的方法来反序列化 Json.Net 中的抽象类?

是否可以通过模板指定抽象类变量类型?