带转换的继承类的JSON序列化

本文只是一个简单的知识点,撰文起因是之前在项目中用到内部类的JSON序列化有问题,后来发现是自己写法错误。这里权当一个记录吧。

在通过继承方式实现语言的多态性时,对有转换和替换关系的基类、子类对象进行JSON的序列化和反序列化,需要设置JsonSerializerSettings中的类型名称TypeNameHandling枚举才能生效。

如类定义如下:

public abstract class Base
{
    public virtual void Display()
    {
        Console.WriteLine("Base class");
    }
}

public class Derive : Base
{
    public override void Display()
    {
        Console.WriteLine("Derive class");
    }
}

如果按照以往经验,直接进行,则会出现异常:

Derive d = new Derive();

string str = JsonConvert.SerializeObject(d);
//string str = JsonConvert.SerializeObject(d, Formatting.Indented, jset);

Base b = JsonConvert.DeserializeObject<Base>(str);
//Base b = JsonConvert.DeserializeObject<Base>(str, jset);

b.Display();

运行异常如下:

Could not create an instance of type ConsoleApplication1.Base. Type is an interf
ace or abstract class and cannot be instantated.

正确的处理方式如下:

JsonSerializerSettings jset = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects };
Derive d = new Derive();
string str = JsonConvert.SerializeObject(d, Formatting.Indented, jset);
Base b = JsonConvert.DeserializeObject<Base>(str, jset);

b.Display();

可以看到,通过使用JsonSerializerSettings来对序列化进行一下特定的设置,其中TypeNameHandling.Objects表示在进行序列化时将.NET的类型名称包含进去。这样便可实现基类和子类的转换。上述代码运行后的输出如下:

Derive class

TypeNameHandling信息参见JSON.NET.

标签: c#, json, 序列化, 抽象类, 多态

添加新评论