3

大家。

我正在尝试保存我的课程:

TA= class(TPersistent)
private
    FItems: TObjectList<TB>;

    FOnChanged: TNotifyEvent;
public
    constructor Create;
    destructor Destroy; override;
    ...
    procedure Delete(Index: Integer);
    procedure Clear;
    procedure SaveToFile(const FileName: string);
    ...
    property OnChanged: TNotifyEvent read FOnChanged write FOnChanged;
end;

使用以下代码归档:

var
  Storage: TJvAppXMLFileStorage;
begin
  Storage := TJvAppXMLFileStorage.Create(nil);
  try
    Storage.WritePersistent('', Self);
    Storage.Xml.SaveToFile(FileName);
  finally
    Storage.Free;
  end;

但文件总是空的。

我做错了什么?

4

2 回答 2

2

看起来 TJvCustomAppStorage 不支持属性中的泛型。该代码没有使用扩展 RTTI,并且对 TJvCustomAppStorage.GetPropCount 的调用返回 0。

这就引出了另一个问题——是否有支持泛型的 Delphi 对象序列化库??

我的测试代码:

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, Classes, Generics.Collections, JvAppXmlStorage;
type

  TA = class(TPersistent)
  private
    FItems: TObjectList<TPersistent>;
  public
    constructor Create;
  published
    property
      Items: TObjectList < TPersistent > read FItems write FItems;
  end;

  { TA }

constructor TA.Create;
begin
  FItems := TObjectList<TPersistent>.Create;
end;

var
  Storage: TJvAppXMLFileStorage;
  Test: TA;
begin
  Test := TA.Create;

  Test.Items.Add(TPersistent.Create);

  Storage := TJvAppXMLFileStorage.Create(nil);
  try
    Storage.WritePersistent('', Test);
    WriteLn(Storage.Xml.SaveToString);
    ReadLn;
  finally
    Storage.Free;
  end;

end.
于 2011-06-11T06:10:43.457 回答
1

我不确定,但如果 TJvAppXMLFileStorage 使用 RTTI,那么我认为您必须发布要保存/加载的属性。

于 2011-06-10T21:59:14.947 回答