dポイントプレゼントキャンペーン実施中!

お世話になっております。
現在、シリアライズとデシリアライズの勉強をしているのですが、
デシリアライズの方が正常に行えないという状況に陥っています。

起こっている具体的な現象なのですが、
シリアライズ自体は問題無く行え、ファイルも作成されているのですが、
デシリアライズの段で例外はスローされずに表向き正常にデシリアライズ処理が走っているにも関わらず、
どうも正しく復元されていないのか、
復元されたはずのフィールドが参照するオブジェクトの内容を出力しようとしても、
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メソッドを含む。デシリアライズ検証用クラス)
以上です。よろしくお願いします。

A 回答 (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が出力されるはずよ。
でも実際は・・・。

熟練者もたまに間違える参照の罠。
これが答えよ!
    • good
    • 0
この回答へのお礼

お世話になっております。

なんという事でしょう。
デシリアライズを行うメソッドの仮引数が違うオブジェクトを参照する様になっただけで、
呼び出し側の実引数は元の参照を保ったままだったとは。
こんな初歩的なミスで大はまりしてしまうとは情けない限りです。
その上自分で解決する事を放棄してしまっていただなんて……。
askaaska様の実に的確なヒントによって問題は無事解決しました。
(復元したオブジェクトを戻す様に件のメソッドの実装を修正し、無事動作する事を確認しました)
今後はこういった初歩的な部分のバグが潜んでいないかどうかを、よく確認するようにしていこうと思います。

本当にありがとうございました。

お礼日時:2010/01/27 20:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!