Home > 2009年05月

2009年05月

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • Comments (Close): -
  • TrackBack (Close): -

Serializeについて

  • 2009-05-30 (Sat)
  • Java

バーボンです。

今回はシリアライズについて調べた情報をまとめてみました。

-Serialization(シリアライズ・直列化・シリアル化)とは

「クラスの情報(インスタンス変数の値)をまるごと一度に保存する」こと
具体的にはオブジェクトのステート(状態)をバイトストリームに変換することで保存します。


-Serializationを日本語にすると「直列化」だそうだけど、どういうこと?

オブジェクトは大抵、関連するオブジェクトへの参照を持っています。メモリ上でその参照をたどっていくと、ツリー構造またはネットワーク構造になります。これをそのまま送信しても同じアドレスに配置できるとは限らないのでデータが一続きになるように並べ換え、参照を相対アドレスにするなど、列の中だけでまとめるから「直列化」というようです。


-いつ使うの?

ネットワークごしにオブジェクトが送られるとき / オブジェクトの状態がDBやファイルに保存されるときなど、オブジェクトをプログラムの外部に持ち出す必要があるときに使います(例:HTTPセッションにオブジェクトを保存するとき)。メモリ状態のままではオブジェクトを外部に渡せないので、基本的なデータ構造であるバイナリに変換して渡します。


-シリアライズするために何をすればいいの?

マーカーインターフェース(実装すべきメソッドが定義されていないからっぽのインターフェース)である java.io.Serializableをインプリメントするだけ

public class Foo implements Serializable{
    //処理
} 

「このクラスはシリアライズ対応である」というマークです。


-なんでもシリアライズできるの?

クラス内のフィールドがプリミティブ型かシリアライズ可能なクラスであることが大前提です。
※フィールドが参照型の場合、インスタンス変数の値(オブジェクトリファレンス)に対応するオブジェクトはすべて自動的にシリアライズされます

シリアライズできないもの・場合もあります

・static変数

シリアライズの対象になるのはオブジェクトなので、もともとシリアライズの対象外です。

・シリアライズできないクラス

たとえばThread・Socket・Connection・Streamなどのクラスはシリアライズできません。システムのリソースを使っているので、それを単純に、他のホストに移動させたり、状態をファイルに保存しておくということができません。これらのフィールドを持ったクラスをシリアライズしたい場合、シリアライズの処理をカスタマイズ(親のオブジェクトにwriteObject と readObject を実装)して対処する方法があります。(調査中)

・シリアライズ対象クラスのスーパークラス(親クラス)がシリアライズ可能でない場合、スーパークラスにデフォルトコンストラクタが無いか、privateになっていてアクセスできない場合、シリアライズできません。

基本的にSerializableを実装すべきではないものもあります

・内部クラス

無名クラス・ローカルクラス名がクラスの定義に対してどのように対応しているかは定義していないため、内部クラスのデフォルトのシリアライズ形式が不明確になります。


-クラス内でシリアライズしたくないフィールドはどうすればいいの?

transient修飾子をフィールドにつけます。これをつけると、Serializableをimplementsしていても、シリアライズ時に無視されます。


Reference
http://ameblo.jp/togoe1204/entry-10010472956.html
http://www.itarchitect.jp/technology_and_programming/-/27074.html
http://www.ne.jp/asahi/hishidama/home/tech/java/serial.html
http://www.asahi-net.or.jp/~DP8T-ASM/java/tips/Serializable.html
  • Comments (Close): -
  • TrackBack (Close): -

Home > 2009年05月

Recent Comments
Recent Trackback
Search
Meta
Links
Feeds

Page Top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。