【发布时间】:2012-06-08 17:37:16
【问题描述】:
我对编程很陌生(在课堂环境之外)。
我正在开发一个具有插件的应用程序。每个插件打包/解包它的状态(作为字典)并将自己添加到包含所有打包状态的字典中。我正在使用 Json.Net 序列化/反序列化并将每个插件传递给它自己的类,以根据项目是保存还是打开来打包/解包。
我遇到的问题是,当我的第一个插件将其打包状态的字典版本解包时,我开始重新填充每个属性,第一个属性(字典中的第一项)是一个 DataTable。我收到一条错误消息:
Unable to cast object of type 'Newtonsoft.Json.Linq.JArray' to
type 'System.Data.DataTable'.
这是我的序列化代码。
IDictionary<string, IDictionary<string, object>> pluginStates =
new Dictionary<string, IDictionary<string, object>>();
signaller.RaiseSaveRequest(pluginStates); //gets all of the plugins' packedState
JsonSerializer serializer = new JsonSerializer();
serializer.ObjectCreationHandling = ObjectCreationHandling.Replace;
serializer.TypeNameHandling = TypeNameHandling.All;
using (StreamWriter sw = new StreamWriter(strPathName))
using (JsonWriter writer = new JsonTextWriter(sw))
{
serializer.Serialize(writer, pluginStates);
}
和反序列化。
IDictionary<string, IDictionary<string, object>> pluginStates =
new Dictionary<string, IDictionary<string, object>>();
JsonSerializer serializer = new JsonSerializer();
serializer.ObjectCreationHandling = ObjectCreationHandling.Replace;
serializer.TypeNameHandling = TypeNameHandling.All;
StreamReader sr = new StreamReader(fullName);
JsonTextReader reader = new JsonTextReader(sr);
string json = sr.ReadToEnd();
pluginStates = serializer.Deserialize<IDictionary<string, IDictionary<string, Object>>>(reader);
pluginStates = JsonConvert.DeserializeObject<IDictionary<string, IDictionary<string, Object>>>(json);
sr.Close();
reader.Close();
signaller.UnpackProjectState(pluginStates);
我尝试查看有关 NewtonSoft.Json 的文档,但我几乎不理解它以及如何使它在我的代码中工作。我想一旦插件获得打包状态以解包,我需要对转换器或解析做一些事情。打包后,插件的第一个字典条目被保存为 DataTable。然后,当在 Unpack 中时,它是带有 : 分隔符的值中的实际数据表。
我会提供屏幕截图,但我还没想好怎么做。任何想法我错过了什么? 谢谢!
【问题讨论】:
-
问题是
DataTable以一种特殊的方式序列化,它有自己的内置转换器,可以将其转换为数组(这意味着它不包含类型信息)。我不确定如何解决这个问题。
标签: c# serialization json.net