4

我正在使用新的 XE7 版本升级最初使用 Delphi XE4 编码的项目。此应用程序将其主要输出保存为一个编组的 JSON 文件,用户可以加载、编辑和保存该文件,类似于使用 Word 文档所做的操作。

它们不直接与 json 一起使用,它只是用作文件格式。我遇到的问题是 XE7 输出的类型TPointF与 XE4 不同,这在尝试解组时会导致问题。

如果我只需要处理使用新版本创建的打开文件但我必须支持旧版本文件至少一年,这将不是问题。看起来 XE7 输出了 TPointF 记录中所有可能的字段(它是一个变体记录类型)

下面是XE7 输出的示例

使用TJsonValueTJsonMarshal

{
  "type":"tstMnfHole.TmnfHole",
  "id":1,
  "fields":
  {
    "fctrPoint":
    [
      [0.625,132.5],
      0.625,
      132.5
    ]
  }
}

使用rest.json TJson.ObjectToJsonString(myHole)

{
  "ctrPoint":
  [
    [0.625,132.5],
    0.625,
    132.5
  ]
}

下面是XE4 输出的示例

使用TJsonValueTJsonMarshal

{
  "type":"tstMnfHole.TmnfHole",
  "id":1,
  "fields":
  {
    "fctrPoint":[0.625,132.5]
  }
}

我的问题是:

  1. 有没有一种简单的方法来处理这个问题,而不必覆盖默认编组并创建自定义转换器/恢复器,以便 XE7 版本输出与 XE4 相同?
  2. 这值得在 Embarcadero Quality Central 上发布吗?

适用于 XE4 和 XE7 的小型控制台测试应用程序。


XE7


program testPointf;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  System.Types,
  // rest.json,
  data.dbxjsonReflect,
  //data.dbxjson,
  system.json,
  tstMnfHole in 'tstMnfHole.pas';

var
  myHole:  TmnfHole;
  valJson: TJSONValue;
  Marshal: TJSONMarshal;
begin
  try
    {*** Create new test hole ***}
    myHole      := TmnfHole.Create(0.625, 132.5);
    try
      Marshal   := TJSONMarshal.Create(TJSONConverter.Create);
      try
        valJson := Marshal.Marshal(myHole);
        try
          Writeln(valJson.ToString);
        finally
          valJson.Free;
        end;
      finally
        Marshal.Free;
      end;
    finally
      myHole.Free;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

unit tstMnfHole;

interface

uses system.types;

type
  TmnfHole = class(TObject)
    //...
    fctrPoint:  TPointF;
    constructor create; overload;
    constructor create(thisCtrPoint: TPointF); overload;
    constructor create(thisX, thisY: single); overload;
    //...
  end;

implementation

{ TmnfHole }
constructor TmnfHole.create;
begin
  fctrPoint := TPointF.Create(0.75, 120.50);
end;

constructor TmnfHole.create(thisCtrPoint: TPointF);
begin
  fctrPoint := TPointF.Create(thisCtrPoint.X, thisCtrPoint.Y);
end;

constructor TmnfHole.create(thisX, thisY: single);
begin
  fctrPoint := TPointF.Create(thisX, thisY);
end;

end.


XE4


testPointf.dpr:替换system.jsondata.dbxjson

4

0 回答 0