web-dev-qa-db-ja.com

シリアル化されたオブジェクトのファイル拡張子

Serializableオブジェクトをディスクに保存する場合、どのファイル拡張子が最適ですか?

FileOutputStream fos = null;
ObjectOutputStream out = null;
try {
    fos = new FileOutputStream(filename);
    out = new ObjectOutputStream(fos);
    out.writeObject(mySerializableObject);
} catch (IOException ex) {
    ex.printStackTrace();
} finally {
    IOUtils.closeQuietly(out);
}
18
Edd

「.ser」はファイルサフィックスの妥当な選択です- http://www.file-extensions.org/ser-file-extension

ただし、他の一般的に使用されるアプリケーションのサフィックスと衝突しない限り、使用するサフィックスにはほとんど違いがないと主張することができます。

Javaシリアル化されたオブジェクトファイルは、クラスパスに関連するクラスがあるJavaアプリケーションによってのみ(通常の方法で)読み取ることができます。ワンサイズ-fits-all ".ser"サフィックスは、それらのクラスが何であるか、およびアプリケーション起動フレームワークがそれらを見つける場所についての手がかりを提供しません。したがって、ダブルクリックを提供するためにWindowsスタイルのファイル関連付けを設定することはできませんアプリケーションの起動。


Serファイルを表示または編集する方法はありますか?

可能性はありますが、非常に困難で、特定の条件下でのみです。

ファイルの内容は、シリアル化されたクラスに大きく依存します。これで、そのクラスの名前、および(場合によっては)シリアル化されたフィールドの名前とタイプを判別できます。ただし、クラスがカスタムのシリアル化/外部化を使用する場合、表現はバイナリデータの不透明なブロブになり、ファイルにデコード方法に関する手がかりがありません。 Java SEクラスライブラリの多くの重要なクラスは、効率のためにカスタムシリアル化を使用しているため...多くのアプリケーションクラスも同様であるため、不透明なblobの問題はかなり一般的です。

他の可能なアプローチは、.serファイルに記載されているすべてのクラスの.classファイルを見つけ、オブジェクトに逆シリアル化し、リフレクションを使用して逆シリアル化されたオブジェクトのフィールドにアクセスすることです。それらを微調整して再シリアル化することもできます。ただし、すべての.classファイルの適切なバージョンがない場合、これは初心者ではありません。

33
Stephen C