我正在尝试序列化/反序列化在以下单元中声明的TMySerializableClass:
unit Unit6;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Generics.Collections, System.SyncObjs, DBXJSon,
DBXJSonReflect;
type
TForm6 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
public
{ Public declarations }
end;
TMySerializableClass<T> = class
MyStringField: string;
MyIntegerField: Integer;
MyBooleanField: Boolean;
end;
var
Form6: TForm6;
implementation
{$R *.dfm}
procedure TForm6.Button1Click(Sender: TObject);
var
Mar: TJSONMarshal; //Serializer
UnMar: TJSONUnMarshal; //UnSerializer
SerializedObject: TJSONObject;
aMySerializableClass1: TMySerializableClass<Integer>;
aMySerializableClass2: TMySerializableClass<Integer>;
aString: string;
begin
try
aMySerializableClass1:= TMySerializableClass<Integer>.Create;
aMySerializableClass2:= TMySerializableClass<Integer>.Create;
Mar:= TJSONMarshal.Create(TJSONConverter.Create);
try
SerializedObject := Mar.Marshal(aMySerializableClass1) as TJSONObject;
finally
Mar.Free;
end;
Memo1.Text:= SerializedObject.ToString;
// UnMarshalling Kid
UnMar := TJSONUnMarshal.Create;
try
aMySerializableClass2 := UnMar.UnMarshal(SerializedObject) as TMySerializableClass<Integer>;
finally
UnMar.Free;
end;
finally
aMySerializableClass1.Free;
aMySerializableClass2.Free;
end;
end;
end.当我序列化它时,一切正常工作,而当反序列化为相同类型的新实例化变量时,我得到以下错误:
First chance exception at $74E5C41F. Exception class EConversionError with message 'Internal: Cannot instantiate type Unit6.TMySerializableClass<System.Integer>'. Process Project7.exe (2252)编辑:这与
TMySerializableClass<T>有关,它是一个通用的。如果我宣布它为TMySerializableClass,反序列化就会很好。
想法?
发布于 2017-01-17 04:00:04
无法在XE5上进行测试,但在柏林10.1上,在我添加别名(例如泛型类型为
TMySerializableClassInteger = TMySerializableClass<Integer>;看起来,如果不这样做,Delphi就不会生成RTTI信息。
最新消息。似乎Delphi不需要别名,只是在接口部分有一些特殊类的声明。因此,如果您将变量或表单字段声明为TMySerializableClass<Integer>,它也将工作。
https://stackoverflow.com/questions/41686685
复制相似问题