- PR -

transient( トランジェント )って何?

投稿者投稿内容
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2003-07-18 16:08
引用:

>シリアライズとは、「JavaBeansでオブジェクトの状態を保存する場合に、Serializable
インタフェースを実装することで、コード生成しなくても、状態の保存や復元をしてくれる
機能のこと」と考えていいのでしょうか?

JavaBeansだけで使うとは限りませんけどね。ちなみに「状態の保存」がシリアライズで
「状態の復元」がデシリアライズです。

>直列化というと、並列処理みたいなものの仲間(もしくは反対のもの)を想像していました。

そういう意味のシリアライズもあります。確かに混乱の元ではありますね。

>JavaBeansを作ることが無ければ、覚える必要はない(使う事がない)と考えてもいいので
しょうか?

RMIとかEJBとか使わないんですか? 分散オブジェクト間でオブジェクトを受け渡すには、
Serializableである必要がありますよ。

Astmild
常連さん
会議室デビュー日: 2003/06/09
投稿数: 30
お住まい・勤務地: 大田区
投稿日時: 2003-07-18 16:14
引用:
シリアライズとは、「JavaBeansでオブジェクトの状態を保存する場合に、Serializable
インタフェースを実装することで、コード生成しなくても、状態の保存や復元をしてくれる
機能のこと」と考えていいのでしょうか?

状態の保存や入出力は、シリアライズの利用例のようです。

下記のサイトにシリアライズの説明があります。
http://msugai.fc2web.com/java/IO/serialize.html
書籍では、Java Black Book に説明が載っています。

これによると、シリアライズとは「オブジェクトをバイトストリームに変換すること」で、
メリットは「オブジェクトの入出力が可能になる」「オブジェクトをファイルに保存できる」事です。
#わらびさんが同じ事を使用例とされていますね。今気が付きました。
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2003-07-18 17:12
以下のサイトのサンプルを動かしてみて、動きはわかりました。
http://www2s.biglobe.ne.jp/~yuuki_ki/java_io7.htm

「オブジェクトをバイトストリームに変換すること」ということはわかったのですが、
逆になぜそういう動きを「直列化」というのか、やっぱりぴんときません。

「読み込み処理に備えオブジェクトを一連のつながりのあるデータとして書き込む必要
がある」という記述がありますが、「オブジェクトを一連のつながりあるデータに整列
する(されているのを保証する?)」ことをシリアライズというのでしょうか?


stoc
会議室デビュー日: 2003/03/27
投稿数: 11
投稿日時: 2003-07-18 17:17
はじめまして stocと申します。

シリアライズがいまいち分からなかったので実際にテストしてみたので
ソースを添付します。何かの参考になればと思います。



Car.javaファイル
コード:

import java.io.Serializable;

public class Car implements Serializable {
public Car (String name) {
this.name = name;
}
// transient private String name;
private String name;

public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}


Garage.javaファイル
コード:

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class Garage {
public static void main(String [] arg) {

try {
Car ferrarin = new Car("ferrarin");
ObjectOutputStream garage = new ObjectOutputStream(
new FileOutputStream(
"serialobject.dat"));
garage.writeObject(ferrarin);
garage.flush();
garage.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}


Q.transientとは?
上記のソースは、実行するとシリアライズされたファイル(serialobject.dat)を
吐き出します。

nameフィールドにtransientを付けて実行した時と付けない時のserialobject.dat
をエディタで確認すると

transientを付けたときはnameフィールドがファイルから消えていました。
これで、「シリアライズの対象外を示す」ということは納得しました。
オブジェクトの保存対象外ってことなんですね。

Q2.何も定義されていないインタフェースの意味
このフォーラムでマーカーという言葉を聞くまであまりピンときませんでした。
別になくてもいいんじゃないの?とおもったので
実際に、Car.javaファイルのimplements Serializableを削除して
上記を実行してみたら、NotSerializableExceptionが例外として出力されました。
jdkのソースを確認してみるとgarage.writeObject(ferrarin);の部分で

} else if (obj instanceof Serializable) {

というチェックを行っていました。(ObjectOutputStream.javaの1045行目付近)
swatさんのコメント通りでした。



[ メッセージ編集済み 編集者: stoc 編集日時 2003-07-18 17:22 ]
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2003-07-18 17:22
上記サイトのサンプルを実行すると、オブジェクトのバイナリファイルができ、
それを読み込んでオブジェクトを生成、実行できました。

これは、オブジェクトの中でオブジェクトを生成している場合でも、芋づる式に
トランジェント以外のオブジェクトも出力すると考えていいのでしょうか?

オブジェクトを芋づる式に出力して、芋づる式に読み込むため、一連のつながり
あるデータに並べる必要がある(直列化?)それをSerializableインターフェース
によって、javaが勝手にやってくれている。
その直列化したデータをObjectOutputStreamで出力し、ObjectInputStreamで
読み込んでいると解釈すればいいのでしょうか?

unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-07-18 17:38
unibon です。こんにちわ。

引用:

maruさんの書き込み (2003-07-18 17:12) より:
「オブジェクトをバイトストリームに変換すること」ということはわかったのですが、
逆になぜそういう動きを「直列化」というのか、やっぱりぴんときません。


#Serializable や Externalizable はかなり使った経験はありますが。
私もピンときません。なぜ直列じゃないとダメなんでしょう。
と、いろいろ考えてみたのですが、もし直列化されていないと、
なんらかのデータ構造を持ってしまい、分解しきれていないため、
保存や転送のための扱いやすいデータにできないためだと思います。

でも、それが理由ならシリアルが必須ではないような気もします。
たしかに、ファイルはシーケンシャルに扱うのが楽だし、
メモリの読み書きやデータ伝送もシーケンシャルなほうが楽なのは確かですが。
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2003-07-18 17:54
まだ、わかったような、わかってないような状態なんですが・・・・

オブジェクト(トランジェント以外)をバイナリに吐き出すのはわかるのですが、
文字列リテラルや final のものなんかも吐き出されるのだろうか・・・?

maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2003-07-18 18:57
こんなサイト見つけました。
http://www.metabolics.co.jp/OOTechnology/JavaPD/JavaPDHTML-1/index19.htm

なんか、わかったような気がしてきました。

・オブジェクト指向の登場
  ↓
・分散オブジェクトに発展
  ↓
・オブジェクトを永続的に使いたい
  ↓
・メモリ上のオブジェクトをネットワークやファイルでやりとりする
  ↓
・そのためにオブジェクト内のデータを直列(整列)化する必要あり
  ↓
・そのための機能としてSerializableインターフェースがある。

・・・という感じですか?

また、Serializableインターフェースをインプリしたところで、なにがしらの機能
が付加されるわけでなく、単に「シリアライズする(される・されてる?)データですよ」
というマーキングだけであって、実際には ObjectInputStream なんかの内部で、
わたされたオブジェクトは直列化なのか?を判断して適切な処理をしている。

という感じでしょうか?

今まで、EJBやRIMなど、ぜんぜん縁がありませんでした。
これを機会に、分散オブジェクトちょっと勉強してみます。

[ メッセージ編集済み 編集者: maru 編集日時 2003-07-18 18:59 ]

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