【问题标题】:Deserializing inherited classes反序列化继承的类
【发布时间】:2015-05-15 12:17:13
【问题描述】:

我想将参数设置从后端应用程序发送到前端。我还需要能够拥有不同类型的参数(端口号、文件夹、静态字符串等)。

所以我设计了一个基类,参数如下:

public abstract class Parameter
{
    public abstract bool isValid();
}

假设我们有两种类型的文件夹参数:

public abstract class Folder : Parameter
{
    public string folderName { get; set; }

    protected Folder(string folderName)
    {
        this.folderName = folderName;
    }
}

public class ReadWriteFolder : Folder
{
    public ReadWriteFolder(string folderName) : base(folderName)
    {
    }

    public override bool isValid()
    {
        return isReadable() && isWritable();
    }
}

public class ReadFolder : Folder
{
    public ReadFolder(string folderName) : base(folderName)
    {
    }

    public override bool isValid()
    {
        return isReadable();
    }
}

这是从 WebAPI 使用的,所以这是我的控制器:

public Dictionary<String, Parameter> Get()
{ 
    Dictionary<String, Parameter> dictionary  = new Dictionary<String, Parameter>();
    dictionary.Add("TemporaryFiles", new ReadWriteFolder("C:\\temp\\"));
    dictionary.Add("AnotherTemporaryFiles", new ReadWriteFolder("D:\\temp\\"));

    return dictionary;
}

这会产生以下 JSON 序列化: {"TemporaryFiles":{"folderName":"C:\\temp\\"},"AnotherTemporaryFiles":{"folderName":"D:\\temp\\"}} 这似乎是合理的。

我的问题是:如何将其反序列化回原始类型?还是把序列化改成更容易反序列化的?

【问题讨论】:

    标签: c# json serialization asp.net-web-api2


    【解决方案1】:

    您使用什么进行序列化?如果是 JSON.Net(这里有很多人会建议!),有很多相关的问题:

    how to deserialize JSON into IEnumerable with Newtonsoft JSON.NET

    但关键是类型名称处理,它将用类型信息装饰元素以便能够反序列化它们:

     JsonSerializerSettings settings = new JsonSerializerSettings
     {
        TypeNameHandling = TypeNameHandling.All
     };
    
    string strJson = JsonConvert.SerializeObject(dictionary, settings);
    

    然后你应该可以直接反序列化。

    var returnDictionary = JsonConvert.DeserializeObject<Dictionary<String, Parameter>>(strJson, settings)
    

    【讨论】:

    • 这就是线索!我实际上不知道我使用了 JSON.net(我刚刚使用了 WebAPI 模板提供的那个)。一旦我设置了 TypeNameHandling 参数,一切都按我的预期工作。谢谢!
    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多