お世話になっております。
現在、シリアライズとデシリアライズの勉強をしているのですが、
デシリアライズの方が正常に行えないという状況に陥っています。
起こっている具体的な現象なのですが、
シリアライズ自体は問題無く行え、ファイルも作成されているのですが、
デシリアライズの段で例外はスローされずに表向き正常にデシリアライズ処理が走っているにも関わらず、
どうも正しく復元されていないのか、
復元されたはずのフィールドが参照するオブジェクトの内容を出力しようとしても、
nullが表示されてしまうという事が起きています。
尚、シリアライズ時には参照先の値が存在していた事はシリアライズと同時に
シリアライズ元となるオブジェクトの値を標準出力して確認してあります。
(シリアライズで作成されたファイルの中身の検証を行ったわけではないので、
シリアライズの時点で既に正しい実行では無い可能性があるかもしれませんが)
何故うまくいかないのか調べていましたが解明できずにいます。
どうかお知恵を貸していただきたいです。
ソースを記載すると文字数制限を超えてしまいますので、
以下に今回の問題となっている挙動を示すソースのURLを記載します。
※全てのソースはパッケージtoolsの中に含まれています。
※ファイルはカレントディレクトリ以下のserializeフォルダに配置するようにしています。
http://13.pro.tok2.com/~dabun/tools/RecordMap.java
http://13.pro.tok2.com/~dabun/tools/Record.java
http://13.pro.tok2.com/~dabun/tools/WriteMain.java
http://13.pro.tok2.com/~dabun/tools/ReadMain.java
<ソース補足>
・RecordMap.java(HashMapのフィールドにInnerRecordクラス以下のオブジェクトを保持するクラス)
・Record.java(RecordMapの内部クラスInnerRecordの外部公開用インターフェース)
・WriteMain.java(mainメソッドを含む。シリアライズ検証用クラス)
・ReadMain.java(mainメソッドを含む。デシリアライズ検証用クラス)
以上です。よろしくお願いします。
No.1ベストアンサー
- 回答日時:
あらあら、とんでもない勘違いをしているようね。
まず
デシリアライズは成功しているはずよ。
デシリアライズまでのコードにミスはないわ。
勘違いしているのは別のところよ。
簡単なサンプルをあげるわ。
研究してみて。
public class Test {
private String str;
public Test(String s) {
this.str = s;
}
public String toString() {
return this.str;
}
public static void change(Test t) {
t = new Test("xyz");
}
public static void main(String[] args) {
Test t = new Test("abc");
Test.change(t);
System.out.println(t);
}
}
※コンパイルも何もしていないので少々の間違いがあるかも?
このTestクラスを動かしたときに出力される結果を予測して頂戴。
あなたの作ったReadMainクラスならきっとxyzが出力されるはずよ。
でも実際は・・・。
熟練者もたまに間違える参照の罠。
これが答えよ!
お世話になっております。
なんという事でしょう。
デシリアライズを行うメソッドの仮引数が違うオブジェクトを参照する様になっただけで、
呼び出し側の実引数は元の参照を保ったままだったとは。
こんな初歩的なミスで大はまりしてしまうとは情けない限りです。
その上自分で解決する事を放棄してしまっていただなんて……。
askaaska様の実に的確なヒントによって問題は無事解決しました。
(復元したオブジェクトを戻す様に件のメソッドの実装を修正し、無事動作する事を確認しました)
今後はこういった初歩的な部分のバグが潜んでいないかどうかを、よく確認するようにしていこうと思います。
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#にて別クラスの関数を使いたい
-
親クラスから子クラスへアクセス。
-
型Containerのメソッドadd(S...
-
VisualC++でクラスのヘッダーフ...
-
違うクラスからの変数の共有化
-
visual studioのデザイナ画面で...
-
ASP Pageの孫継承のPage_Load
-
範囲外の数値を代入したらエラ...
-
クラス間でのデータ参照
-
C#のクラスライブラリでメッセ...
-
関数内の変数に<summary>コメン...
-
c++,ある関数のクラスから別の...
-
C++でfriendクラスにしているの...
-
dllエクスポート時のdeclspec(d...
-
ひとつのファイルにクラスは1つ?
-
継承したクラス側のクラス名の取得
-
ネストしたenumへのリフレクシ...
-
JAVAのjsonの扱いについて
-
import と extends について
-
例外処理(throws Exception)...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
範囲外の数値を代入したらエラ...
-
C#にて別クラスの関数を使いたい
-
クラス間でのデータ参照
-
c++,ある関数のクラスから別の...
-
visual studioのデザイナ画面で...
-
C++でfriendクラスにしているの...
-
import と extends について
-
Java リフレクションについて
-
C#のクラスライブラリでメッセ...
-
Java
-
C#でほかのファイルにある自作...
-
ひとつのファイルにクラスは1つ?
-
継承したクラス側のクラス名の取得
-
C# インターフェイスの実装
-
a href="..." とServlet
-
super.paint(g)を呼び出す意...
-
親クラスから子クラスへアクセス。
-
無名パッケージからのインポート
-
java-別クラスの変数の使い方を...
おすすめ情報