gpt4 book ai didi

delphi - 泛型和 Marshal/UnMarshal。我在这里缺少什么?

转载 作者:行者123 更新时间:2023-12-03 15:48:51 40 4
gpt4 key购买 nike

最好提到这一点:我正在使用 Delphi XE2 - 但 XE 或 2010 也应该可以解决问题:-)

此问题现已位于质量中心 QC#99313请投票:-)

截至 2011 年 10 月 20 日,Embarcadero 已将 QC 报告标记为“已解决”。SilverKnight 提供了解决方案。但内河码头缺乏信息令我担忧。由于该解决方案建议使用除 XE(2) 帮助系统、其他论坛和 CC 中解释的其他源代码。但你自己看看质量控制。

给定这些类型声明:

type
TTestObject : Class
aList : TStringList;
function Marshal : TJSonObject;
end;

TTestObjectList<T:TestObject> : Class(TObjectList<T>)
function Marshal : TJSonObject; // How to write this ?
end;

我想为 TTestObjectList 实现 Marshal 方法。据我所知 - 我应该为 TTestObject 和美丽注册一个转换器它的 - 为每个元素调用 Marshal。

TTestObject 的编码(marshal)注册此转换器:

RegisterConverter(TStringList,
function(Data: TObject): TListOfStrings
var
i, Count: Integer;
begin
Count := TStringList(Data).Count;
SetLength(Result, Count);
for i := 0 to Count - 1 do
Result[i] := TStringList(Data)[i];
end);

通用 TTestObjectList Marshal 方法:

function TTestObjectList<T>.Marshal: TJSONObject;
var
Mar : TJsonMarshal; // is actually a property on the list.
begin
Mar := TJsonMarshal.Create(TJSONConverter.Create);
try
RegisterConverter(TTestObject,
function(Data: TObject): TObject
begin
Result := TTestObject(Data).Marshal;
end);
Result := Mar.Marshal(Self) as TJSONObject;
finally
Mar.Free;
end;
end;

这是使用列表的简化示例。

var
aTestobj : TTestObject;
aList : TTestObjectList<TTestObject>;
aJsonObject : TJsonObject;
begin
aTestObj := TTestObject.Create; // constructor creates and fills TStringlist with dummy data.
aJsonObject := aTestObj.Marshal; // This works as intended.

aList := TTestObjectList<TTestObject>.Create;
aJsonObject := aList.Marshal; // Fails with tkpointer is unknown ....
end;

当然,我有类似的恢复(解码)功能。但上面的代码应该可以工作 - 至少据我所知。

所以如果有人可以向我指出:

为什么列表无法编码?

我知道我的列表中有 TJsonMarshal 属性 - 但它也有一个转换器/恢复器。

更改为 TTypeStringConverter(而不是 TTypeObjectConverter)将返回有效字符串。但我一直喜欢在 TJsonObject 上工作的想法。否则,在从字符串解码到 TTestObject 时,我会遇到同样的问题(或类似的问题)。

非常欢迎任何建议/想法。

最佳答案

这里有一个“解决方法”来“修复”Delphi XE2 上的问题(我能够重复相同的运行时错误)。

请注意,在创建 Marshal 变量时,项目中定义了以下代码:

Marshal := TJSONMarshal.Create(TJSONConverter.Create);

将两行更改为:

Marshal := TJSONMarshal.Create;  //use the default constructor - which does the same thing as TJSONConvert.Create already

解决了问题 - TOndrej 提供的测试应用程序执行时没有错误。

关于delphi - 泛型和 Marshal/UnMarshal。我在这里缺少什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7528829/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com