Delphi XE10 序列化 TDictionary 为 JSON 的问题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值