2011-06-10 17 views
3

everyone。保存/加載TObject(TPersistent)爲XML

我想救我的課:

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; 

但文件總是空空的。

我做錯了什麼?

回答

1

我不確定,但如果TJvAppXMLFileStorage使用RTTI,那麼我認爲你必須發佈你想要保存/加載的屬性。

2

看起來像TJvCustomAppStorage不支持屬性中的泛型。該代碼沒有使用擴展RTTI,並且調用TJvCustomAppStorage.GetPropCount返回0.

這導致了另一個問題 - Are there Delphi object serialization libraries with support for Generics?

我的測試代碼:

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. 
+0

它可以OK,如果我們從仿製藥改爲陣列? – PSyLoCKe 2014-06-25 13:15:52