- PR -

固定長バイナリデータの作成

投稿者投稿内容
YUT1018
会議室デビュー日: 2002/12/11
投稿数: 5
投稿日時: 2004-11-19 15:00
ukさん:
>そもそも「バイナリデータ」とはどのようなものを指していますか?

あるオブジェクトにEUC_JP変換したbyte配列を引数として渡します。この時のbyte配列の
ことをバイナリデータと言いました。(そもそも言い方が間違ってるかな?)
具体的に言いますと下記のin_hのことです。

String str = "123 ABC 456789";
byte[] in_h = str.getBytes("EUC_JP");
int ret = Foo.hoge(in_h);

ちょっと話がソレますが
つまりやりたいことはArrayListの全要素を順に取り出しシリアライズしたいのです。
そのシリアライズ手段に文字連結を行ったのですが、ホントは各要素をメンバに持つ
JavaBeansから一発でシリアライズできないかな?と探してみましたが、なんともやり
方がわからず、素直に文字連結ロジックをゴリゴリ書いてしまったわけです。ハイ。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-11-19 16:05
ArrayListの中身がSerializableを実装していれば
何も考えなくても直列化はできますよ。
(ArrayListはSerializableを実装してる)

JavaBeansも本来Serializableを実装するものですし、
直列化ができない場合というのは(例外が発生するはず)
メンバに直列化できないものが含まれている場合です。

Listの中にBeanが入っているのか
Beanの中にListが入っているのかわかりませんが、
ターゲットのBeanにSerializableを
正しく実装すれば直列化は可能かと思います。

uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-11-19 16:26
YUT1018さんはJavaでいうところのシリアライズ(直列化)をしようとしているのでしょうか。
なんか違うような気がしますが。データの最終的な送り先はJavaではないのではないですか。

YUT1018さんがやろうとしていることをそのままできるようにするのは難しくありませんが、
まず最終的に何がやりたいかを書いたほうがいいのではないですか。
YUT1018
会議室デビュー日: 2002/12/11
投稿数: 5
投稿日時: 2004-11-19 16:55
ukさん:
>YUT1018さんはJavaでいうところのシリアライズ(直列化)をしようとしているのでしょうか。

私はJavaで扱っているデータをネットワークを介してやり取りできる形式に変換する
という意味でシリアライズと言いました。
Javaで言うところのシリアライズとは意味が違うのでしょうか?

>データの最終的な送り先はJavaではないのではないですか

う! するどい・・・。
やりたいことはJavaで扱えるオブジェクトを直列化して、最終的にはCORBAオブジェクト
をRPCをしたいんです。前述のソースで
int ret = Foo.hoge(in_h);
なる部分が実際のRPC部分です。
あまりにやりたいことそのままで恐縮なので、とりあえず「こんな風に実装すればいい
んじゃない?」程度のヒントを頂ければ幸いです。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-11-19 17:29
それで、今まで書かれているような仕組み(固定長バイト配列)は、そのCORBAオブジェクトの
インタフェース仕様としてすでに決まっているのでしょうか。そうでなければもっと簡単に
できそうな気がしますが。


>Javaで言うところのシリアライズとは意味が違うのでしょうか?

「直列化」の一般的な意味としては同じだと思います。

Javaには、オブジェクトを直列化する仕組みが標準で備わっています。もっとも簡単な場合は、
Serializableインタフェースを実装するだけです(フィールド変数がすべて直列化可能である
必要がありますが)。このようにしておくと、たとえばRMIでインスタンスをやり取りする場合
でも、Javaが勝手にシリアライズ/デシリアライズしてくれます。
YUT1018
会議室デビュー日: 2002/12/11
投稿数: 5
投稿日時: 2004-11-19 22:45
java serializeで検索したり
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8263&forum=12
を参考にしながら下記のようなコードを書いてみましたが
そもそも私の求めている結果とは違いました。
Serializableインタフェースの実装では、Objectそのものを直列化するので
私が求めているようなデータ部のみ(下記コードでbeanのメンバ)の直列化とは違うことが分かりました。
やはり地道に連結させていくしかないのでしょうか?
それとも例えばObjectOutputStreamのwriteObjectをオーバーライドして、defaultWriteObject()を
実装しなくしてしまうことは良いのでしょうか?(もちろんデシリアライズされることは考慮せずに)
コード:
HogeBean bean = new HogeBean();
bean.setName("123       ");
bean.setTel("0312345678");

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutput out = new ObjectOutputStream(baos);

out.writeObject(bean);
out.flush();
out.close();

data = baos.toByteArray();
baos.close();
String str = new String(data, "ISO8859_1"); 
System.out.println("str=[" + str + "]");

StringBuffer sb = new StringBuffer();
for(int i=0; i<data.length; i++) {
	sb.append("[" + Integer.toString(data[i],16) + "]");
}
System.out.println(sb.toString());


ちなみに、呼出するCORBAオブジェクトのIDLコンパイルで生成されたJavaソースで
引数がbyte配列で取るようになっており、固定長レイアウトは既にインタフェース
仕様として決まっています。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-11-22 10:38
引用:

ちなみに、呼出するCORBAオブジェクトのIDLコンパイルで生成されたJavaソースで
引数がbyte配列で取るようになっており、固定長レイアウトは既にインタフェース
仕様として決まっています。



#折角CORBAをつかっているのに…謎のIF仕様ですね^^;

writeObject()からdefaultWriteObject()を外すだけでJavaオブジェクトの
デフォルトの直列化作業を全てコントロールはできなかったような覚えがある
のですが…
ObjectOutputStreamが、writeObject()呼出し毎に、内部で何かを書いている
ようです。テスト結果のバイトアレイの先頭に、数バイトのヘッダがついてま
せんか?

どちらにしても結局、望ましいフォーマットによる直列化を行うメソッドをど
こかに記述するしかなさそうですね。

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