シリアライズのやり方は?


Fusa  URL  2009-01-07 17:29:19  No: 33044  IP: 192.*.*.*

アプリケーションのデータを保存するときに
IniファイルやレジストリやXMLファイルに保存とかという手法があるかと思いますが、

ある自作クラスがあったとして
そのクラスのパブリックな変数やパブリックなプロパティに対して
値を保存復帰する、よりよいやり方を模索しています。

やり方をご存知でしたら教えてください。

こういうことをやりたいのです。

TAがあったとして、
A1 := TA.Crate;
SerializeSaveToFile(A1, パス名)

と保存でき、

A2 := TA.Create;
SerializeLoadFromFile(A2, パス名);

というように読み出す方法ができないでしょうか

いちど、
SerializeSaveToFileとSerializeLoadFromFileを実装してしまうと


TBを作成して
B1 := TB.Create;
でも、使えるし、

TFormに対してもパブリックなプロパティが保存復帰させたりすることが
できたらうれしいと思うのですが。

そんなのできるでしょうか?

> オブジェクトの内容をファイルに保存、復元する
> オブジェクトのXMLシリアル化、逆シリアル化を行う
http://dobon.net/vb/dotnet/file/xmlserializer.html

この内容と、同様とはいわないですが近いことができたらうれしいなと
思っております。

よろしくお願いします。

編集 削除
もしかしたら  2009-01-07 18:40:07  No: 33045  IP: 192.*.*.*

質問を読んでいたら、
TMemoryStreamのWriteComponent,ReadComponentが
頭に浮かびました。

オブジェクトの状態を保存復帰させるのなら
これで出来そうな気もするのですがいかがでしょうか?

的外れならすみません。

編集 削除
take  2009-01-10 10:45:17  No: 33046  IP: 192.*.*.*

過去に同じような質問があるようです。
https://www.petitmonte.com/bbs/answers?question_id=2271

あとからクラスを変更しても復帰時にエラーを出したくないなら
オブジェクトのストリーム保存/読込クラス
というのもあるようです。
http://vram.hp.infoseek.co.jp/delphi.htm

編集 削除
Fusa  2009-01-26 13:56:23  No: 33047  IP: 192.*.*.*

お返事ありがとうございます。

遅くなりました。
参考にしてやってみます。

totonicaさんのところみても、余計なデータも含まれて保存されてしまうようですね。もう少し使いやすくならんものだろうかと、思ってしまいます。

Delphiメモ
No008:Read/WriteComponentメソッド
http://totonica.s41.xrea.com/doc/delphi_memo/delmemo_008.htm

編集 削除
KHE00221  2009-01-27 00:20:28  No: 33048  IP: 192.*.*.*

Integer,String型のプロパティ値取得なら

uses
   TypInfo
var
    I,J,Count: Integer;
    S: String;
begin
   Count := GetPropList(Self,PropList);
   I := 0;
   while I < Count do
   begin
     // PropList^[I].Name                  //プロパティ名
     // PropList^[I].PropType^.Kind        //プロパティの型

     case  PropList^[I].PropType^.Kind pf
       ktInteger: //Integer型
       begin
         J := GetOrdProp(Self,PropList^[I].Name) 
       end;
       ktLString: //String型
       begin
         S := GetStrProp(Self,PropList^[I].Name);
       end;
   end;
end;

で出来る。

編集 削除
KHE00221  2009-01-27 00:21:25  No: 33049  IP: 192.*.*.*

追加
var
  PropList: PPropList;

編集 削除
KHE00221  2009-01-27 00:23:11  No: 33050  IP: 192.*.*.*

変更
ktLString -> tkLString
ktInteger -> tkInteger

型はいろいろあるけど

type
  TTypeKind = (tkUnknown, tkInteger, tkChar, tkEnumeration, tkFloat,
    tkString, tkSet, tkClass, tkMethod, tkWChar, tkLString, tkWString,
    tkVariant, tkArray, tkRecord, tkInterface, tkInt64, tkDynArray);

編集 削除
kuze  2009-02-25 00:40:24  No: 33051  IP: 192.*.*.*

ObjStreamV
http://www14.atwiki.jp/vram/pages/6.html
を使用しては如何でしょうか?

編集 削除