JSONMarshalled 在 Delphi XE10 中不起作用(再次)

JSONMarshalled not working in Delphi XE10 (again)

我有一个 class 我想传递给 datasnap 服务器,但是 class 包含这个字段 Picture 应该是一个 TPicture 但是现在我使用一个整数来避免得到 marshall错误 "tkPointer currently not supported" :(

我尝试通过添加 [JSONMarshalled(False)] 来省略 field/property "Picture",但没有成功。

我已经按照这里的帖子中的建议添加了单位 JSONMarshalled not working in Delphi

unit TestObjU;

interface

uses
  Classes, System.Generics.Collections, System.SyncObjs, System.SysUtils,
  JSON, DBXJsonReflect, REST.JSON,
  Data.FireDACJSONReflect, FireDAC.Comp.Client, vcl.ExtCtrls,
  pngimage, graphics, variants,
  GlobalFunctionsU, GlobalTypesU;

{$M+}
{$RTTI EXPLICIT FIELDS([vcPrivate])}
type
  EPerson = class(Exception);
  EPersonsList = class(Exception);

  TGender = (Female, Male);

  TPerson = class(TObject)
  private
    FFirstName: string;
    FLastName: string;
    FId: Integer;
    FGender: TGender;
    FModified : Boolean;
    [JSONMarshalled(False)]
    FPicture: Integer;
//    [JSONMarshalled(False)] FPicture : TPicture;
    function GetName: string;
    procedure SetFirstName(const Value: string);
    procedure SetLastName(const Value: string);
    function GetId: Integer;
    procedure SetGender(const Value: TGender);
    procedure SetModified(const Value: Boolean);

  public
    property Id : Integer read GetId;
    property Name : string read GetName;
    property FirstName : string read FFirstName write SetFirstName;
    property LastName : string read FLastName write SetLastName;
    property Gender : TGender read FGender write SetGender;
    property Modified : Boolean read FModified write SetModified;
//    property Picture : TPicture read FPicture write FPicture;
    [JSONMarshalled(False)]
    property Picture : Integer read FPicture write FPicture;
    function Update : Boolean;
    function Delete : Boolean;

    constructor Create(AId : Integer; AFirstName, ALastName : string; AGender : TGender); overload;
    constructor Create(AFirstName, ALastName : string; AGender : TGender); overload;
    destructor destroy; override;

    function ToJsonString: string;

  end;

但显然它对编组没有影响,图片仍然存在 - 我错过了什么?

function TPerson.ToJsonString: string;
begin
  result := TJson.ObjectToJsonString(self);
end;


08-03-2016 10:26:24 [NORMAL] AddPerson serialized {"firstName":"Donald","lastName":"Duck","id":24,"gender":"Female","modified":false,"picture":92415648}

您正在使用 REST.Json 单元中的 TJson.ObjectToJsonString,并且需要不同的属性来跳过名为 JSONMarshalledAttribute

的字段

您应该将代码更改为 [JSONMarshalledAttribute(False)]

Delphi 在较旧的 Data.DBXJsonReflect 和较新的 REST.Json 单元之间有一些混淆,您不应该在同一代码中将它们混合在一起。只选其中一项。

REST.Json.TJson.ObjectToJsonString

REST.Json.Types.JSONMarshalledAttribute

Data.DBXJSONReflect.JSONMarshalled

是 - 我找到了解决方案,当使用 DBX(而不是 REST)时,您需要添加此单元 "Data.DBXJSON" 而不是 "REST.JSON" 并更改两个 "from/to" 方法对于 un/marshaling 这个对象是这样的。

注意。 ToJSONString 由于某种原因泄漏,我将不得不对此进行更多调查。

function TPerson.ToJsonString: string;
var
  JSONMarshal: TJSONMarshal;
begin
  result := '';
  JSONMarshal := TJSONMarshal.Create(TJSONConverter.Create);
  try
    Result := JSONMarshal.Marshal(self).ToString;
  finally
    JSONMarshal.Free;
  end;
end;

class function TPerson.FromJsonString(AJSONString: string): TPerson;
var
  JSONUnMarshal: TJSONUnMarshal;
begin
  JSONUnMarshal := TJSONUnMarshal.Create;
  try
    Result := JSONUnMarshal.Unmarshal(TJSONObject.ParseJSONValue(AJSONString)) as TPerson;
  finally
    JSONUnMarshal.Free;
  end;
end;