Delphi XE10 序列化 TDictionary 为 JSON 的问题
2017-04-05 14:04
633 查看
1. 在 XE10 里面,对 TObjectList<T> 进行序列化为 JSON 的操作是成功的。大概代码如下,测试通过。
S := TJson.ObjectToJsonString(FMyObjectList);
AObjectList := TJson.JsonToObject<TObjectList<TMyObject>>(S);
2. 照上述方法,序列化一个 TDictionary 为字符串也成功。然后,反序列化回来也成功。
S := TJson.ObjectToJsonString(FMyDictionary);
MyDictionary := TJson.JsonToObject<TDictionary<string, TMyObject>>(S);
上述代码,执行成功。
但是,它并没有生成 TDictionary 内部应该有的一个 private 的对象 FComparer: IEqualityComparer<TKey>;
这样一来,如果对反序列化回来的 MyDictionary 进行常规的索引读操作,比如 MyDictionary.Items['abc'] 则因为这样的方法会调用到 TDictionary 内部的 GetBucketIndex 方法,而这个方法要用到 FComparer,就会导致
AV 错误。
对这样反序列化回来,内部缺乏 FCompare 的 TDictionary,做以下操作是成功的:
for S in AList.Keys do 这样循环是成功的。
begin
Memo1.Lines.Add(S);
end;
for O in AList.Values do
begin
Memo1.Lines.Add(O.FThumbnailName); 这样循环也是成功的。
end;
----------------------------------------------
综上所述,如果想把一个 TDictionary 序列化为 JSON 再恢复,需要多做一点:反序列化时,自己创建一个 TDictionayr 的实例(自己创建的,是包含 FComparer 的),然后对反序列化回来的 TDictionary 进行一个循环,将里面的内容,全都复制到自己创建的 TDictionary 里面去。自己创建的这个就可以用了。
又及:好像这个问题在 10.2 里面已经改好了。我没有测试过 10.2
S := TJson.ObjectToJsonString(FMyObjectList);
AObjectList := TJson.JsonToObject<TObjectList<TMyObject>>(S);
2. 照上述方法,序列化一个 TDictionary 为字符串也成功。然后,反序列化回来也成功。
S := TJson.ObjectToJsonString(FMyDictionary);
MyDictionary := TJson.JsonToObject<TDictionary<string, TMyObject>>(S);
上述代码,执行成功。
但是,它并没有生成 TDictionary 内部应该有的一个 private 的对象 FComparer: IEqualityComparer<TKey>;
这样一来,如果对反序列化回来的 MyDictionary 进行常规的索引读操作,比如 MyDictionary.Items['abc'] 则因为这样的方法会调用到 TDictionary 内部的 GetBucketIndex 方法,而这个方法要用到 FComparer,就会导致
AV 错误。
对这样反序列化回来,内部缺乏 FCompare 的 TDictionary,做以下操作是成功的:
for S in AList.Keys do 这样循环是成功的。
begin
Memo1.Lines.Add(S);
end;
for O in AList.Values do
begin
Memo1.Lines.Add(O.FThumbnailName); 这样循环也是成功的。
end;
----------------------------------------------
综上所述,如果想把一个 TDictionary 序列化为 JSON 再恢复,需要多做一点:反序列化时,自己创建一个 TDictionayr 的实例(自己创建的,是包含 FComparer 的),然后对反序列化回来的 TDictionary 进行一个循环,将里面的内容,全都复制到自己创建的 TDictionary 里面去。自己创建的这个就可以用了。
又及:好像这个问题在 10.2 里面已经改好了。我没有测试过 10.2
相关文章推荐
- AJAX JSON中日期类型DateTime格式化的序列化自定义对象以及自定义类型参数的问题处理
- JavaScriptSerializer 对 DateTime 数据类型的JSON序列化的问题
- Json序列化 解决Date问题
- 将Dictionary序列化为json数据 、json数据反序列化为Dictionary
- 将Dictionary序列化为json数据 、json数据反序列化为Dictionary
- Dictionary在XML序列化时遇到的问题及应对方案
- json序列化技巧 时间问题处理
- C#:Json数据反序列化为Dictionary并根据关键字获取指定的值
- 解决“使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错”的问题
- 探讨JQUERY JSON的反序列化类 using问题的解决方法
- JavaScriptSerializer 对 DateTime 数据类型的JSON序列化的问题
- DataContractJsonSerializer反序列化Dictionary
- JSON 序列化长度限制问题
- windows phone 中反序列化json时出现的问题
- Json.NET序列化日期格式差异问题
- json 序列化日期的问题
- Entity Framework object && Json 序列化的问题
- javascript中创建对象,并序列化为json,通过$.ajax的提交json数据到后台方法,取值为null的问题
- 解决json-lib的一些序列化循环处理问题
- C# Json数据反序列化为Dictionary并根据关键字获取指定值