お世話になっております。
現在、シリアライズとデシリアライズの勉強をしているのですが、
デシリアライズの方が正常に行えないという状況に陥っています。
起こっている具体的な現象なのですが、
シリアライズ自体は問題無く行え、ファイルも作成されているのですが、
デシリアライズの段で例外はスローされずに表向き正常にデシリアライズ処理が走っているにも関わらず、
どうも正しく復元されていないのか、
復元されたはずのフィールドが参照するオブジェクトの内容を出力しようとしても、
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で質問しましょう!
似たような質問が見つかりました
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- Visual Basic(VBA) VBA アドインについて お詳しい方 ご教授をお願いします。 相談事項 現在以下の対応を実施した所、 1 2022/11/02 16:53
- Windows 10 Windows10起動しない、エラー0xc0000185修復方法 2 2022/07/14 12:28
- Visual Basic(VBA) vba メモリ節約 3 2022/09/16 21:45
- JavaScript javaScriptで画面に値を入れるには 1 2022/08/14 12:27
- UNIX・Linux ubuntuのサーバー(virtual box)が、再起動するとデータが消えてしまいます。 4 2022/04/27 21:29
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
クラス間でのデータ参照
-
構造 他のクラスの構造体を別...
-
関数内の変数に<summary>コメン...
-
デシリアライズでオブジェクト...
-
違うクラスからの変数の共有化
-
型Containerのメソッドadd(S...
-
C#にて別クラスの関数を使いたい
-
visual studioのデザイナ画面で...
-
c++,ある関数のクラスから別の...
-
C#のクラスライブラリでメッセ...
-
java-別クラスの変数の使い方を...
-
範囲外の数値を代入したらエラ...
-
例えば、以下のようなクラスでm...
-
import と extends について
-
ゲーム画面の項目選択の結果を...
-
javaのメソッドの戻り値について
-
SwingでgetContentPaneのエラー...
-
ネストしたenumへのリフレクシ...
-
C++でfriendクラスにしているの...
-
Java
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
クラス間でのデータ参照
-
範囲外の数値を代入したらエラ...
-
関数内の変数に<summary>コメン...
-
c++,ある関数のクラスから別の...
-
C#にて別クラスの関数を使いたい
-
java-別クラスの変数の使い方を...
-
a href="..." とServlet
-
C++でfriendクラスにしているの...
-
親クラスから子クラスへアクセス。
-
構造 他のクラスの構造体を別...
-
Java リフレクションについて
-
import と extends について
-
C#でほかのファイルにある自作...
-
C#のクラスライブラリでメッセ...
-
Java
-
アップキャスト、ダウンキャス...
-
無名パッケージからのインポート
-
違うクラスからの変数の共有化
-
SwingでgetContentPaneのエラー...
-
ひとつのファイルにクラスは1つ?
おすすめ情報