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


Fusa  URL  2009-01-08 02:29:19  No: 33044

アプリケーションのデータを保存するときに
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-08 03:40:07  No: 33045

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

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

的外れならすみません。


take  2009-01-10 19:45:17  No: 33046

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

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


Fusa  2009-01-26 22:56:23  No: 33047

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

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

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

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


KHE00221  2009-01-27 09:20:28  No: 33048

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 09:21:25  No: 33049

追加
var
  PropList: PPropList;


KHE00221  2009-01-27 09:23:11  No: 33050

変更
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 09:40:24  No: 33051

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加