【发布时间】:2011-09-23 12:19:31
【问题描述】:
最好提一下: 我正在使用 Delphi XE2 - 但 XE 或 2010 也应该可以解决问题 :-)
这个问题现在在 Quality Central QC#99313 请投票 :-)
截至 2011 年 10 月 20 日,Embarcadero 已将 QC 报告标记为“已解决”。 SilverKnight 提供了解决方案。但是 Embarcadero 缺乏信息让我担心。由于该解决方案建议使用 XE(2) 帮助系统、其他论坛和 CC 中解释的源代码以外的其他源代码。但是你自己看看 QC。
鉴于这些类型声明:
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 时,我会遇到同样的问题(或类似的问题)。
欢迎任何建议/想法。
【问题讨论】:
-
我不敢相信 Embarcadero 将其标记为已修复 --- 这是一种解决方法 - 如果已修复,他们将不会有一个允许您传入自己的实例的重载构造函数!或者,在这种特殊情况下,对象应该在使用 EITHER 构造函数时起作用。我会说仍然存在一个错误。我已经在 QA 中发布了让他们重新考虑将其关闭为“用户错误”
标签: delphi generics marshalling