Javaシリアライズ出力ファイルビューア
制作 2009年3月9日 更新 2009年3月23日
【目的】Javaプログラム開発時において、デバッグのため変数の中身などをダンプさせたいときがあります。
多くの変数を持つクラスの場合、独自の様式で出力するメソッドを実装するのは手間がかかるため、Java標準機能を利用して解決します。
【方法1】
シリアライズ(直列化)機能を使ってバイナリファイル出力する
→ java.io.Serializable インターフェイスを実装 (implements) する
出力対象:非static かつ transient 指定されていないメンバ変数
【方法2】
java.beans.XMLEncoder を使って XML ファイル出力する(JDK1.4以降)
→ JavaBeans 仕様同様のアクセッサ (getter,setterメソッド) を定義する
※なお出力したファイルから状態復元させるには、引数のないデフォルトコンストラクタが必須であったり、その他状態を意識する必要がある。
ここではクラス設計に影響を与えない【方法1 シリアライズ】を利用することにします。
プロトコル・仕様は公開されているので解析可能ですが、複雑な形式のためちょっと大変です。
see: オブジェクト直列化ストリームプロトコル
そこで、多少は読みやすいテキスト形式に変換するビューアツール(Javaコマンドライン)を作成しました。
バイナリを逐次翻訳して表示しているだけなので、元のjavaファイルを復元まではできませんが、参考にはなるはずです。
簡単なファイルしか動作確認しておりませんが、フリーソフトとして公開します。ソースファイルも同梱してあります。
とりあえず個人利用は自由。ベータにも満たない完成度のため再配布は不可でお願いします。
# エディット機能や高度なグラフィカルインターフェイス等は私は作るつもりはないです。ご了承を
・Java(Sun)ページ最後のLinkクラス例の場合の解析結果出力サンプル
ClassName = List
SerialVersionUID : 69c88a154016ae68
ClassDescFlags : SC_SERIALIZABLE = 2
fields : 2
0: prim_typecode = int , FieldName = value
1: obj_typecode = object , FieldName = next , ClassName = LList;
SuperClass = NULL
* List
0 : value (int) = 17
1 : next (object) = ReferenceHandle = 7e0000 => List
* List
0 : value (int) = 19
1 : next (object) = NULL
ReferenceHandle = 7e0003 => List
・履歴: Ver0.10 2009/03/09 新規作成 Ver0.20 2009/03/16 SC_WRITE_METHOD がオンのファイルにも対応 Ver0.30 2009/03/23 継承先・元の両方にフィールドが存在した場合に異常終了していたので修正 デバッグ用のコードが混在していたので修正 現時点未対応:ENUM, EXCEPTION関連