- PR -

オブジェクトをファイルに保存

1
投稿者投稿内容
しんにぃ
会議室デビュー日: 2006/09/05
投稿数: 17
投稿日時: 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();
}
}
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-09-26 19:23
このBackupクラスは、こういう設計にする必要があるんでしょうか。
「バックアップ」はdataにひもづいたものではないんだから、dataはsave/loadメソッドの引数/戻り値になるんじゃないかと。
ファイル名をコンストラクタで渡してフィールドに持つほうが、分かるような…。
名前もBackupperとか、モノのほうがそれらしいですね。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2006-09-26 22:35
絶対にHORBでなければならいないのでしたら駄目なんですが、
ObjectOutputStreamとかXMLEncoderとか、とりあえず標準
APIでもシリアライズ処理をする方法もありますよ。

しんにぃ
会議室デビュー日: 2006/09/05
投稿数: 17
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)