2015-05-15 122 views
0

我想从后台应用程序发送参数设置到前端。我还需要能够具有不同类型的参数(端口号,文件夹,静态字符串等)。反序列化继承类

所以我设计了一个基类,参数为这样的:

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\\"}}这似乎是合理的。

我的问题是这样的:我该如何反序列化回到原始类型?或者将序列化改为更容易反序列化的东西?

回答

2

你在使用什么序列化?如果是JSON.Net(!其中有许多在这里所暗示的),还有一些realted问题:

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) 
+0

这就是线索!我实际上并不知道我使用了JSON.net(我刚刚使用了WebAPI模板提供的那个)。只要我设置TypeNameHandling参数,一切都按我的意图工作。谢谢! – Zyberzero