DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: webb123
今日帖子: 10
在线用户: 29
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 riverbo (riverbo) ★☆☆☆☆ -
普通会员
2018/12/12 14:48:10
标题:
TJsonSerializer.Deserialize<T> memory leak,反序列化内存泄露 浏览:2030
加入我的收藏
楼主:
-- 类代码
  TCmdReqParam<T> = class
  private
  protected
  public
    uri: string;
    param: T;
  end;

  TCmdRequest<T> = class
  private
  protected
  public
    cmd: string;
    request: TCmdReqParam<T>;
  end;

  TCmdStringData = class
  private
  protected
  public
    value: string;
    class function process(const Text: String): string; overload; static;
  end;

-- 反序列化为复杂类型

class function TCmdStringData.process(const Text: String): string;
var Serializer: TJsonSerializer;
  u: TCmdRequest<TCmdStringData>;
begin
  Serializer := TJsonSerializer.Create;
  try
    u := Serializer.Deserialize<TCmdRequest<TCmdStringData>>(Text);
    try
      Result := 'ok';
    finally
      u.Free;
    end;
  finally
    Serializer.Free;
  end;
end;

----
测试字符串:

{
  "cmd": "cmd-test",
  "request": {
    "uri": "a=b&b=看恋",
    "param": {
      "value": "i am test"
    },
    "keepResponse": false
  }
}
此帖子包含附件:
PNG 图像
大小:4.5K
----------------------------------------------
riverbo
作者:
男 riverbo (riverbo) ★☆☆☆☆ -
普通会员
2018/12/12 14:58:41
1楼: 请问,有人用此类方法,发现相同的memory leak吗?
----------------------------------------------
riverbo
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2018/12/12 15:33:30
2楼:  和反序列化无关,request 和 param 没释放:
 u.request.param.Free;
 u.request.Free;
 u.Free;

不如用结构体。
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 riverbo (riverbo) ★☆☆☆☆ -
普通会员
2018/12/12 16:03:53
3楼: @earthsbest 加了,依然报泄露。

class function TCmdBooleanData.process(const Text: String): string;
var Serializer: TJsonSerializer;
  u: TCmdRequest<TCmdBooleanData>;
begin
  Serializer := TJsonSerializer.Create;
  try
    u := Serializer.Deserialize<TCmdRequest<TCmdBooleanData>>(Text);
    try
      try
        Result := TCmdResponse.successJson<TCmdBooleanData>(u);
      except
        on e: Exception do begin
          Result := TCmdResponse.errorJson<TCmdBooleanData>(u, e.Message);
        end;
      end;
    finally
      u.request.param.free;   // add free
      u.request.Free;         // add free
      u.Free;
    end;
  finally
    Serializer.Free;
  end;
end;
此帖子包含附件:riverbo_2018121216449.zip 大小:60.1K
----------------------------------------------
riverbo
作者:
男 riverbo (riverbo) ★☆☆☆☆ -
普通会员
2018/12/12 16:04:29
4楼: 源代码上来,麻烦各位大侠看看,谢了。
此帖子包含附件:riverbo_2018121216428.zip 大小:60.1K
----------------------------------------------
riverbo
作者:
男 riverbo (riverbo) ★☆☆☆☆ -
普通会员
2018/12/13 9:15:58
5楼: @earthsbest,确实如你所言,和Serializer.Deserialize没有任何关系,是自身的变量未释放有关,加上
      u.request.param.free;   // add free
      u.request.Free;         // add free
就好了,长知识了,谢谢了!
----------------------------------------------
riverbo
作者:
男 ksrsoft (cb168) ★☆☆☆☆ -
普通会员
2020/6/25 7:32:34
6楼: injson := system.JSON.Serializers.TJsonSerializer.Create.Serialize<Tperson>(inp);
请问这样写,是不是有内存泄漏
----------------------------------------------
-
作者:
男 user2ccc (零度) ★☆☆☆☆ -
盒子活跃会员
2020/6/25 18:35:06
7楼: 10.4的反序列 是有问题  序列/反序列一个record 该recordc带枚举  反序列会错误 错误提示找不到类型等错误
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行125毫秒 RSS