我对编程还比较新(除了课堂环境之外)。
我正在开发一个具有插件的应用程序。每个插件都会将其状态(作为字典)打包/解包并发送给包含所有打包状态的字典。我使用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。
我可以提供屏幕截图,但我还没有弄清楚如何做到这一点。你有什么想法吗?谢谢!
DataTable
以一种特殊的方式进行序列化,它有自己内置的转换器将其转换为数组(这意味着它不包含类型信息)。我不确定如何解决这个问题。 - svick