- PR -

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

投稿者投稿内容
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2003-07-18 10:50
こんにちは。お世話になってます。

特に困っているわけでもなく、つまらぬ疑問です。
javaのソースコードを眺めていたら、型宣言の箇所に transient という予約語がついて
いるものが多くありました。調べたところ、「シリアライズの対象外を示す」とありました。

具体的にどういうことなんでしょうか?シリアライズ(直列化)って何でしょうか?
どういうときに使うのでしょうか?
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2003-07-18 11:06
引用:

maruさんの書き込み (2003-07-18 10:50) より:
具体的にどういうことなんでしょうか?シリアライズ(直列化)って何でしょうか?
どういうときに使うのでしょうか?


 以下を読んでみましょう。

http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/io/Serializable.html
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/io/ObjectInputStream.html
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/io/ObjectInputStream.html
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2003-07-18 11:39
すいません。

シリアライズに関してドキュメントやgoogleを検索して、読んではいたのですが、
正直いまいちピンときません。

シリアライズもよくわかっていないので、「シリアライズの対象外ってことはtransient
つけなくても、Serializableをインプリメントしなけりゃいいんじゃないの?」とか、
「シリアライズするのに java.io のSerializableを実装するという事は、
java.io(ファイル)関連のクラスに対してのみ直列化を使う?でも、シリアライズの
対象外という transient は、Swingのコンポーネントにもかかれていたし・・・」など、
そもそもシリアライズを理解できていないので、どういったときに使うのかやメリット
デメリットなどわからず、transient との関係も理解できていません。

シリアライズやトランジェントについて、(たとえばオブジェクト指向を車の部品で
たとえるような説明みたいに)もっとわかりやすい説明をどなたかご存知ないですか?
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2003-07-18 11:58
以下にシリアライズの説明があり、ますますわけがわからなくなってます。
http://www2s.biglobe.ne.jp/~yuuki_ki/java_io7.htm

・シリアライズするのにSerializableインタフェースを実装する必要がある。
・Serializableインタフェース自体には何の定義もされていない。
・Serializableインタフェースは単に実装したクラスがオブジェクトのシリアライズ
が可能であることを示す。

意味がわからない・・・・。
何も定義されていないインターフェースにどういう意味があるんだーー!!??
何も定義されていないインターフェースはどういう動きをするんだーー!!??
このような Serializable は、なんで予約語ではなくインターフェースなんだーー!!??

取り乱してしみません。

[ メッセージ編集済み 編集者: maru 編集日時 2003-07-18 12:02 ]
わらび
ベテラン
会議室デビュー日: 2002/08/30
投稿数: 53
投稿日時: 2003-07-18 13:14
こんにちは。わらびです。

例えば、objectをファイルに書き込んだり、そのファイルを読み込んで
objectを作る時や、リモートでobjectの受け渡しをする時に、受け渡し対象
のobjectはSerializableを実装している必要があります。

これは,Cloneable等と同じくマーカの役目で、このobjectは直列化しても大丈夫、という
しるしとして、定義はなくとも実装する必要があります。
Astmild
常連さん
会議室デビュー日: 2003/06/09
投稿数: 30
お住まい・勤務地: 大田区
投稿日時: 2003-07-18 14:21
こんにちは。

>このような Serializable は、なんで予約語ではなくインターフェースなんだーー!!??
マーカーがインターフェースクラスなのは、ただ単に予約語で印をつけるよりも、
「直列化可能な種類」「複製可能な種類」として括った方が、英語圏の人たちにとって
分かりやすいからではないでしょうか。
#英単語で class は「(共通の性質を有する)部類,種類」という意味です。
#オブジェクト指向のクラスもこの意味が由来だと本で読みました。

また、transient が java.io 以外のクラスにも記述されている理由を見つけました。
参考にしてみて下さい。
http://java-house.jp/ml/archive/j-h-b/015073.html
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2003-07-18 15:14
以下のように記事を見つけました。
http://dolphin.eng.ynu.ac.jp/fmm/report1/kanto/java4.html

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

直列化というと、並列処理みたいなものの仲間(もしくは反対のもの)を想像していました。
でも、他にもシリアライズで違った意味の説明もあって、まだいまいちぴんとこない。

JavaBeansを作ることが無ければ、覚える必要はない(使う事がない)と考えてもいいので
しょうか?
swat
常連さん
会議室デビュー日: 2002/03/21
投稿数: 33
お住まい・勤務地: 埼玉県
投稿日時: 2003-07-18 16:06
引用:

Astmildさんの書き込み (2003-07-18 14:21) より:

>このような Serializable は、なんで予約語ではなくインターフェースなんだーー!!??
マーカーがインターフェースクラスなのは、ただ単に予約語で印をつけるよりも、
「直列化可能な種類」「複製可能な種類」として括った方が、英語圏の人たちにとって
分かりやすいからではないでしょうか。
#英単語で class は「(共通の性質を有する)部類,種類」という意味です。
#オブジェクト指向のクラスもこの意味が由来だと本で読みました。




swatです。
マーカーがインターフェースなのは、javaがシリアライズできるのかどうかを判断するために、instanceofを使うので、その判断をtrueにするためだと聞いたことがあります。
すんごいうろ覚えですが。

transientそのものの意味としては、保存すべきでないもの、または、別に保存しておかなくても復元後に調達できるものはしなくてもよい、という意味だと思ってました。
たとえば、シリアライズしたいオブジェクトの中に、あるSingletonオブジェクトの参照などが含まれていて、復元したあとには、最新の状態を持つSingletonを使用する場合などは、またgetInstanceすればいいや、ということでtransientにしておくとか。
#使い方が間違ってたら突っ込んでください
_________________
****** swat ******
http://www.h7.dion.ne.jp/~s_wat/
http://d.hatena.ne.jp/swat/

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