- - PR -
オブジェクトをファイルに保存
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-09-26 18:42
以前にバックアップからオブジェクトを再構築するというスレッドを立てさせていただいたんですが考えても埒があかないと思い、とりあえずプログラムを作ってみようと思ったのですが、まずオブジェクトをファイルにバックアップするところでつまづいてしまいどうしたらいいかわからなくなってしまったのでまたスレッドを立てさせていただきました。
HORBのサンプルをいじっているだけなので細かい部分の意味はわからないのですが、具体的には、Dataというオブジェクトにあるcounterを10までインクリメントして、一度ファイルに保存し、そこからロードしてさらに10インクリメントをするということをしたいのです。 もともとのサンプルでは Data.java Client.java の二つからなっていて、これを改良してdataオブジェクトを新しく自分で作ったBackupオブジェクトに渡してbackupオブジェクトがファイルに保存するというメソッドをもつようにしたいのですがdataオブジェクトの渡し方がよくわからずどうしたらよいかわからない状況です。 ------------------------------------------------------------------------------- HORBのサンプル (Data.java) import horb.orb.*; class Data implements HasSerialHooks { int counter; void work() { for (int i = 0; i < 10; i++) { System.out.println("counter = " + counter); counter++; } } public void _freezeHook(int where) { System.out.println("Data: I'm freezing and going to "+where(where)); } public void _reviveHook(int where) { System.out.println("Data: I've been revived from "+where(where)); } String where(int place) { if (place == IOCI.LOC_NETWORK) return "another host."; else if (place == IOCI.LOC_FILE) return "a file."; else return "somewhere."; } } (Client.java) import horb.orb.*; import java.io.*; class Client { public static void main(String argv[]) throws HORBException, IOException { String fname = "data.fof"; String host = (argv.length == 1) ? argv[0] : "localhost"; ObjectStorage server = new ObjectStorage_Proxy(new HorbURL(host, null)); Data data = new Data(); data.work(); System.out.println("saving an object in a file, "+fname+" on server"); // save the object server.saveObject(data, fname); System.out.println("object has saved. now load it again from server"); // load the object Data data2 = (Data)server.loadObject(fname); data2.work(); } } 自分で作っているプログラム (Backup.java) import horb.orb.*; import java.io.*; class Backup { Data data; Backup(){} Backup(Data d){ Data data = d; } void save() throws HORBException, IOException { String fname = "data.fof"; String host = /*(argv.length == 1) ? argv[0] :*/ "localhost"; ObjectStorage server = new ObjectStorage_Proxy(new HorbURL(host, null)); data.work(); System.out.println("saving an object in a file, "+fname+" on server"); // save the object server.saveObject(data, fname); System.out.println("object has saved. now load it again from server"); // load the object Data data2 = (Data)server.loadObject(fname); data2.work(); } } テスト用のプログラム (Test.java) import horb.orb.*; import java.io.*; class Test { public static void main(String argv[]) throws HORBException, IOException { Data data = new Data(); data.work(); Backup back = new Backup(data); back.save(); } } |
|
投稿日時: 2006-09-26 19:23
このBackupクラスは、こういう設計にする必要があるんでしょうか。
「バックアップ」はdataにひもづいたものではないんだから、dataはsave/loadメソッドの引数/戻り値になるんじゃないかと。 ファイル名をコンストラクタで渡してフィールドに持つほうが、分かるような…。 名前もBackupperとか、モノのほうがそれらしいですね。 |
|
投稿日時: 2006-09-26 22:35
絶対にHORBでなければならいないのでしたら駄目なんですが、
ObjectOutputStreamとかXMLEncoderとか、とりあえず標準 APIでもシリアライズ処理をする方法もありますよ。 |
|
投稿日時: 2006-09-27 18:27
mioさんへ
ご指摘を受けて少し改良してみたところ一応ぎこちないですが dataオブジェクトを生成 dataをファイルに保存 ファイルから再構築 という一連のどうさをすることができました。ありがとうございます!! しかしここでまたつまづいてしまいまして、現在のところData型のオブジェクトには対応できるのですがこれをどうさまざまな型のあるオブジェクトに対応させれば良いのかがわからないのです。 単にData dataとなっているところをObject obj としてもできなくて立ち往生な感じです。。。 小僧さんへ HORBでなければならないわけではないと言えばないのですが、やはり分散オブジェクトを対象としているので分散オブジェクトミドルウェアであるHORBを利用したほうがよいのかなぁっと思っている次第です。 _______________________________________ (Backupper.java) import horb.orb.*; import java.io.*; class Backupper { String fname = "default.fof"; String host = "localhost"; String save(Data data) throws HORBException, IOException { ObjectStorage server = new ObjectStorage_Proxy(new HorbURL(host, null)); System.out.println("saving an object in a file, on server"); // save the object fname = server.saveObject(data, null); return fname; } } (Restructure.java) import horb.orb.*; import java.io.*; class Restructure { String host = "localhost"; Data load(String fname) throws HORBException, IOException { ObjectStorage server = new ObjectStorage_Proxy(new HorbURL(host, null)); System.out.println("object has saved. now load it again from server"); // load the object Data data2 = (Data)server.loadObject(fname); return data2; } } (Test.java) import horb.orb.*; import java.io.*; class Test { public static void main(String argv[]) throws HORBException, IOException { //Data型のオブジェクトdataをインスタンス化 Data data = new Data(); //dataのworkメソッドで10までインクリメント data.work(); //Backupperクラスからbackオブジェクトをインスタンス化 Backupper back = new Backupper(); //backオブジェクトのsaveメソッドに引数としてdataオブジェクトを渡してファイルに保存 //さらにsにファイル名を取得 String s = back.save(data); //Loaderクラスからloadオブジェクトをインスタンス化 Restructure rst = new Restructure(); //sを引数にしてファイルからdataオブジェクトをdata2に再構築 Data data2 = rst.load(s); //data2のworkメソッドで20までインクリメント data2.work(); } } |
1