Delphi XE10 序列化 TDictionary 为 JSON 的问题

2017-04-05 19:25:41来源:CSDN作者:pcplayer人点击

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

相关文章

    无相关信息

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台