Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

シリアライズについて

オブジェクトをファイルに書き出して、そして読み出せるようにするのがシリアライズだとして、そうすると何がいいのでしょうか?別に毎回newで作ればいいじゃん、とか思ってしまいます。どのようなアプリケーションのどんな場面で使用してどんなメリットがあるのでしょうか?具体的に教えてほしいです

30

回答

6698

閲覧

30件の回答

評価

0

眠い。

評価

0

まず、suzukiさんが書かれている一連の処理をシリアライズと言うのではなく、オブジェクトをバイトコードに変換する処理をシリアライズと言います。(逆はデシリアライズ)
暗号・復号のようなイメージです。

例えば、マシンAでFooクラスをnewし、メンバ変数に値をセットしたインスタンスを、マシンBに渡したいとします。
マシンA・B間でメモリを参照し合うなんて事は無理なので、以下のようにします。
[マシンA]
・Fooクラスをnew
・Fooクラスのメンバ変数に値をセット
・Fooクラスをシリアライズ
・シリアライズ化されたバイトコードをマシンAに送信

[マシンB]
・受信したバイトコードをデシリアライズ
・復元されたFooクラスのメンバ変数の値をゲット

上記の仕組みを実現しているのが、RMI・EJBなどです。

評価

0

「インスタンス」というのは、あるクラスのメモリ上のイメージというだけでなく、それぞれで状態が違うわけだ(端的に言えばフィールドの値が違う)。

VMを再起動するなり、すでに挙げられてるように別のマシンに移すなりしたとき、newでは内容までは再現できない。
クラスによっては、フィールドの値全部getterで取ってsetterで入れれば同じものになるが、常に可能とは限らないしアホらしいと思わない?

評価

0

これって、

データをファイルに書き出すことができますけど、
それのどこがいいのでしょうか。
データなんか、その都度、生成すればいいじゃん。

ってのと、本質的には同じだよな。
独立したシステム間はもちろん、
システムを構成する要素同士の間でも、
本質的に同じ仕組みが利用されている。

評価

0

RMIとかservletのsessionのシリアライズとかがいらないと思うなら、いらないのでは。

評価

0

回答ありがとうございます。しかし、いまいち解りません。なぜ 「 オブジェクトごと 」 ファイルに書き出す必要があるのでしょうか?オブジェクトの中身(変数)だけをファイルに書き出して、必要ならそのファイルから変数を取得すればいいんじゃないの、と思うのです。

評価

0

オブジェクトのなんたるかがわかってないんだな。
とりあえず、

その変数が、またオブジェクトだったらどうするの?

と聞いておく。

評価

0

オブジェクトの持っている変数がStringではなくListだったらという事でしょうか?その場合はStringになるまで下っていって、Stringになったらそれをファイルに書き出します。そのファイルからStringを読み出してListに格納して、newしたオブジェクトにそのListを持たす。ではダメですか?java本にいろいろなサンプル、例えば掲示板やショッピングサイトなどが載っていますが、オブジェクトごとDBに保存みたいなコードを見たことがないので、いまいち理解できないのです。

評価

0

いろいろ突っ込みどころ満載だが、たくさん目をつむって、ここは、

その変数がインターフェースだったり、
抽象クラスだったらどうするの?

とだけ書いておく。

だいたい、先入観で凝り固まってるやつに突っ込んでも、
徒労に終わる可能性が高い。

「それはJavaの仕様ではない」としか答えようがないからだ。
そして、それで十分。

はっきりいっとくが、仕様にケチつけるなんて300万年くらい早いよ。

頭を絞るのは悪いことではないがな、
やるならやるで、まずは、仕様に対して素直になりたまえ。
最初にオレオレ仕様を持ち出して、
それを矯正させるなんてアプローチは傲慢だ。

早い話、目をつぶって丸呑みにしろ。
今は、んなことよりも、もっと大事なことがいくらでもある。
後回し後回し。

俺も、にわかには飲み込みにくいものに
ぶつかったことはあるが、
あくまでも、自分にその備えがない、
ということだけは、わきまえてきたつもりだがね。

評価

0

https://java.sun.com/javase/ja/6/docs/ja/platform/serialization/spec/security.html

http://www.javaroad.jp/java_io7.htm

>StringではなくListだったらという
いえ、自作クラスが別の自作クラスを持っていたら、
という意味だと思います。

class A{
B b;
}

のように。


>オブジェクトごとDBに保存みたいな
hibernateを全否定されたみたいで悲しい。

評価

0

suzukiさんが言われるような、普通にデータを永続化する方法にも、DBに保存・CSVに保存など、色々ありますよね?
どんな方法を採用するかはケースbyケースです。

今は「こんな方法もある」程度の理解でも十分かと思います。(ダメ?)


複数サーバ間でデータをやり取りする時に、DBを介さず、透過的にインスタンスを受け渡し出来たら便利だと思いません?
興味があれば、RMIやEJBがどういう原理で成り立っているかを調べてみると、納得できるかも?

評価

0

オブジェクトは単純にnewするだけでは作れないし、
オブジェクトの中にオブジェクトが・・・と、
色んなパターンがある。

newやらset/addとかで復元することもあるけど、
オブジェクト毎に復元方法を取り決めなきゃいけない。

そういう手続きを決めなくてもいいように、
シリアライズの仕様というのがある。

評価

0

回答ありがとうございます。これ以上質問するなみたいな感じになっちゃってますが、もう一回質問します。自分で作る掲示板みたいなサーバーが一個しかない小さいアプリケーションの場合はシリアライズは使用するところがない、複数のサーバー間でデータをやりとりするような大規模アプリケーションで初めて威力を発揮するということでしょうか?

評価

0

規模なんか関係ないよ。
大きかろうが小さかろうが、やってることは同じ。

だいたい、知らなかったり使わなかったりするものは、
シリアライズだけじゃなくて、他にもいっぱいあるでしょ。

評価

0

あと、自覚してないけどお世話になっているものも
いっぱいある、と付け加えておこう。

俺のはともかく、皆さんの投稿読んでるのかね。
自分の欲しいものばっかり言い立ててるが。

評価

0

データクラスに追加や削除が発生するたびに、辻褄合わせに造り直すの?
String1つで終わるようなものでない限り、普通の感覚の人間なら面倒くさい。

システムにおいて、通常保存や復帰のプロセスは中心ではない。
そんなところに普通の人は工数を裂かない。
そこにバグが作り込まれるようなら、なおさらばからしい。


使わなきゃいけないものじゃないんだし、ごちゃごちゃした処理を一発でやってくれることに意味を感じないなら、使わなくていい。
「ListやStringも無駄。全部自分で作れば実効効率がいい」と考える人も、いるかもね。

評価

0

様々な入出力を抽象化したstreamに、writeObject(obj)一発でオブジェクトを書き込めるのが便利だと感じないとしたら、おそらくオブジェクト指向そのものを便利と感じないんじゃないかな。

評価

0

インターフェース、多態性、隠蔽、抽象化・・・
言い出したらきりがないが。

でも見た目「だけ」なら、
カリカリにチューンした手続き型言語のコードと比べたら、
オブジェクト指向型言語のコードは、冗長に見えるのかもね。
APIドキュメントには、使いもしない
クラスやメソッドがずらずら並んでるし。
始めて目にしたとき、「なんだこの贅肉は」という
感想を持ったヤツを、約一名知っている。

評価

0

自分の疑問をさらに具体的に考えました。例えばAさんがフロッピーをBさんに渡すために駅のロッカーを使用します。Aさんはロッカーにフロッピーを入れて、Bさんにロッカーまでフロッピーを取りに来てと電話しました。BさんはAさんからロッカーの暗証番号を聞いてフロッピーを取り出しました。ぼくの疑問はロッカーに入れるのはフロッピーだけでいいんじゃないの?それを持っているAさん自身をロッカーに入れる必要はないでしょ。みたいなイメージです。この状況で、いやAさん自身も入れたほうが便利だと思わない?という状況が解らないのです。

評価

0

アイザック・アシモフ
「前提条件を自在に指定する権限を私に与え給え。
いかなる理論であろうとも、見事、正当化して見せよう」

うろ覚えだから、まんまじゃないけどね。

評価

0

それにしても疲れた。
これ以上、オレオレ仕様の添削にはつきあいません。

評価

0

例えがおかしい。

フロッピーを例にとるか。
フロッピーはいくつかのパーツでできてる。
外装のプラスチックと、中身の円盤、磁性体、シャッター、プロテクトノッチ、ラベル、その他細かい部品。
君はこれら全部をバラバラにして、ロッカーに入れたんだ。

評価

0

初心者の人の場合ファイルやDBに保存する物といったら商品名や値段や品数、掲示板なら名前や回答内容や日時などと思っています。そういうアプリしか見たことがないからですが。
たぶんオブジェクトごと保存というのは単純に商品名などを保存するのと違って使用する用途が違う気がしてきました。そういうアプリと出会うまで理解するのは無理なのか。なんとなくですがみなさんの回答はオブジェクト指向ぽくないですか?

評価

0

俺も往生際悪いなあ・・・。

おまいさんは正しいよ。
ただし。
おまいさんが経験して、理解している、
あるいはそのつもりでいる範囲では、
という超^66535強力な条件がつけばね。

その範囲に、世界のあらゆるものを押し込むことができるかどうかは、
また別の話だ。

評価

0

オブジェクト指向プログラミングの有用性が理解できていない人に、
シリアライズの有効性云々なんてそもそも話せないんじゃ

javaからオブジェクト指向を抜きたいなら勝手にすれば。
でも、一緒に開発はしたくないな。

評価

0

えーと。
じゃぁ例を出しましょう。
顧客クラスがあるとします。
顧客クラスは、顧客情報クラスと、
所属グループクラスとを持っているとします。

このような顧客を保存したいとき、
そのつど顧客をnew(値を設定しまくる)のは、
非常に煩雑ですし、めんどくさいです。


そういうときに、シリアライズを使うと、
シアワセになれます。

イメージできましたでしょうか。

評価

0

楽なんですよ。
シリアライズを使える場面では使ったほうが。

無理やり使うものではないです。
不要なら使わなければいいだけです。

自分でオブジェクトをばらばらにして保存して、読み込むときに組み立てるか、それらを自動でやってくれる仕組みを使うかの違いです。

評価

0

まさにそこです、ばくの疑問は。どんな場面で使うのか。企業の顧客管理システムか゛顧客情報をオブジェクトで保存しているとしたら、へぇ〜そうなんだで終わってしまう疑問なんです。しかしそれだとDB自体の検索機能が使えなくなってしまうので、そういう場面の保存で使用するのではなさそう。ではどういう場面で使うのかです。そのほうが楽チンとか、そこらへんの疑問ではないのです。

評価

10

カオスですね・・・

今、こんな状態です。
(1)suzukiさんは、「Excelで文書が書けるけど、どんなメリットがあるの?」と質問。でもsuzukiさんは表計算を知らない。

(2)回答者は、文書作成しか知らないsuzukiさんのために、文書作成の例に限定して、Excelを使った場合のメリットを説明。

(3)suzukiさんは、「それならWordの方が便利では?」と反論。

結局、文書作成するならWordの方がイイんです。
Excelでも文書は書けますが、本当にExcelのメリットを実感しようと思ったら、表計算を知らないと厳しいのです。


で、本題に戻ると、
データを永続化(ファイルやDBに書き込む事)する場合は、値のみを保存するのが一般的です。suzukiさんの認識で間違っていません。
回答者は、RMIやEJBを知らないsuzukiさんのために、永続化の例だけで、シリアライズの数少ないメリットを説明しようとしますが、苦しいです。

>ではどういう場面で使うのかです。
⇒ネットワークプログラミング・分散オブジェクトなどの技術の一端で効果を発揮します。
ただし、永続化に限定する限り、suzukiさんがシリアライズの用途・利点を実感するのは難しいと思われます。

なので、suzukiさん自身が視野を広げて、RMI・EJBなどの技術を学ばれるのが、一番近道だと思います。
もし、RMI・EJBが必要なければ、同様にシリアライズの知識も今後必要にならないでしょう。

評価

0

なるほど。いや〜すばらしい掲示板でした

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。