我需要提醒一下:
我正在使用Delphi XE2 - 但XE或2010也应该可以胜任 :-)
此问题现在已经在Quality Central QC#99313 中,请投票支持它 :-)
截至2011年10月20日,Embarcadero已将QC报告标记为已解决。
解决方案由SilverKnight提供。但Embarcadero缺乏信息让我感到担忧。因为该解决方案建议使用其他源代码而不是XE(2)帮助系统、其他论坛和CC中解释的源代码。但请自行查看QC。
给定以下类型声明:
我希望能为TTestObjectList实现一个Marshal方法。 据我所知,我应该为TTestObject注册一个转换器,并为其每个元素调用Marshal以使其更加美观。
TTestObject的Marshal会注册以下转换器:
通用的 TTestObjectList Marshal 方法:
当然,我也有类似的恢复(解组)功能。但是上面的代码应该可以工作 - 至少据我所知。
所以,如果有人能指出:
为什么List无法进行编组?
我知道我的列表上有TJsonMarshal属性 - 但它也有一个转换器/还原器。
改用TTypeStringConverter(而不是TTypeObjectConverter)将返回有效的字符串。但是我喜欢一直在TJsonObject上工作的想法。否则,当从字符串解组到TTestObject时,我会遇到相同的问题(或类似的问题)。
欢迎任何建议/想法。
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;
当然,我也有类似的恢复(解组)功能。但是上面的代码应该可以工作 - 至少据我所知。
所以,如果有人能指出:
为什么List无法进行编组?
我知道我的列表上有TJsonMarshal属性 - 但它也有一个转换器/还原器。
改用TTypeStringConverter(而不是TTypeObjectConverter)将返回有效的字符串。但是我喜欢一直在TJsonObject上工作的想法。否则,当从字符串解组到TTestObject时,我会遇到相同的问题(或类似的问题)。
欢迎任何建议/想法。