- - PR -
transient( トランジェント )って何?
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-07-18 16:08
| ||||||||
|
投稿日時: 2003-07-18 16:14
下記のサイトにシリアライズの説明があります。 http://msugai.fc2web.com/java/IO/serialize.html 書籍では、Java Black Book に説明が載っています。 これによると、シリアライズとは「オブジェクトをバイトストリームに変換すること」で、 メリットは「オブジェクトの入出力が可能になる」「オブジェクトをファイルに保存できる」事です。 #わらびさんが同じ事を使用例とされていますね。今気が付きました。 | ||||||||
|
投稿日時: 2003-07-18 17:12
以下のサイトのサンプルを動かしてみて、動きはわかりました。
http://www2s.biglobe.ne.jp/~yuuki_ki/java_io7.htm 「オブジェクトをバイトストリームに変換すること」ということはわかったのですが、 逆になぜそういう動きを「直列化」というのか、やっぱりぴんときません。 「読み込み処理に備えオブジェクトを一連のつながりのあるデータとして書き込む必要 がある」という記述がありますが、「オブジェクトを一連のつながりあるデータに整列 する(されているのを保証する?)」ことをシリアライズというのでしょうか? | ||||||||
|
投稿日時: 2003-07-18 17:17
はじめまして stocと申します。
シリアライズがいまいち分からなかったので実際にテストしてみたので ソースを添付します。何かの参考になればと思います。 Car.javaファイル
Garage.javaファイル
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 ] | ||||||||
|
投稿日時: 2003-07-18 17:22
上記サイトのサンプルを実行すると、オブジェクトのバイナリファイルができ、
それを読み込んでオブジェクトを生成、実行できました。 これは、オブジェクトの中でオブジェクトを生成している場合でも、芋づる式に トランジェント以外のオブジェクトも出力すると考えていいのでしょうか? オブジェクトを芋づる式に出力して、芋づる式に読み込むため、一連のつながり あるデータに並べる必要がある(直列化?)それをSerializableインターフェース によって、javaが勝手にやってくれている。 その直列化したデータをObjectOutputStreamで出力し、ObjectInputStreamで 読み込んでいると解釈すればいいのでしょうか? | ||||||||
|
投稿日時: 2003-07-18 17:38
unibon です。こんにちわ。
#Serializable や Externalizable はかなり使った経験はありますが。 私もピンときません。なぜ直列じゃないとダメなんでしょう。 と、いろいろ考えてみたのですが、もし直列化されていないと、 なんらかのデータ構造を持ってしまい、分解しきれていないため、 保存や転送のための扱いやすいデータにできないためだと思います。 でも、それが理由ならシリアルが必須ではないような気もします。 たしかに、ファイルはシーケンシャルに扱うのが楽だし、 メモリの読み書きやデータ伝送もシーケンシャルなほうが楽なのは確かですが。 | ||||||||
|
投稿日時: 2003-07-18 17:54
まだ、わかったような、わかってないような状態なんですが・・・・
オブジェクト(トランジェント以外)をバイナリに吐き出すのはわかるのですが、 文字列リテラルや final のものなんかも吐き出されるのだろうか・・・? | ||||||||
|
投稿日時: 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 ] | ||||||||
