您的位置:首页 > 编程语言 > Delphi

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: