2011-09-14 7 views
1

私はblogを経由していました。 ObjectOutputStreamが書き込む方法を上書きすることは可能ですか?Javaシリアライズのカスタマイズ

out.datすなわちのiは、ファイルに書いてみましょう
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("C:\\out.dat"))); 
out.writeObject(o); 

私はメモ帳++でファイルout.datを開いたとき、私はバイナリデータを見ました。どちらが理にかなっている。もし私がこのデータの書き方をカスタマイズしたいのであれば、私は、JSON形式で私のout.datファイルがほしいと言うことができます(その一例、それは他の形式でも可能です)。どのような方法でこれを上書きする必要がありますか?

答えて

1

Externalizableを実装して、writeExternalメソッドとreadExternalメソッドをオーバーライドすることで、必要な処理を実行できます。詳細は、http://download.oracle.com/javase/7/docs/platform/serialization/spec/output.html#3146を参照してください。

ストリーム全体の形式ではなく、1つのオブジェクトのシリアル化出力をカスタマイズすることができます。したがって、JSON文字列を他のバイナリデータの中に見つけることができます。

カスタムシリアル化メカニズムを探しているあなたのシナリオでは、
0

私はJavaがJSONにシリアライズするための内部サポートを持っていないと確信しています。

public interface IJSONSerializable{ 
    public String getSerializedForm(); 
} 

そして、私はそれを理解(以降、出力への基本的なFileOutputStreamを使用する:私の意見では、あなたの最善の策は、JSONを取得するためのインタフェースを作成し、JSONにシリアライズしたい任意のオブジェクトが、このインタフェースを実装することです)ObjectOutputStreamは、オブジェクトをバイナリにシリアル化するために使用され、JSONの本来のサポートはありません。

他の思考

あなたはこの道を行くことを選択した場合、あなたがそのようなプロパティや値として物事を書くためのヘルパークラスを書くことができます。

1

この形式は、階層間の通信を維持するために使用する必要があります(ネットワーク上の分散オブジェクトで作業する)。あなたができることは、あなたのきれいなフォーマットを使ってオブジェクトをファイルに保存するハンドラを作成することです。

+0

なぜ彼はそれをしてはいけないのですか?それは最も効率的な転送ではありません(しかし、どちらもデフォルトのJavaシリアル化です)が、ウェブ上で頻繁に問題なく使用されています。彼が正しくそれを行う限り、データがどのように送信されるように見えるかはかなり面白くありません。 – Voo

0

Java自体にはJSONシリアル化のビルトインサポートがありませんが、それを行うフレームワークを見つけることができます。

だから、あなたはJSON形式でシリアライズしたい任意のクラスのためだけに上書き

private void writeObject(java.io.ObjectOutputStream out) 
    throws IOException 
private void readObject(java.io.ObjectInputStream in) 
    throws IOException, ClassNotFoundException; 

文字列形式とバイスであなたに1つのインスタンスのデータを与えてそこにいくつかのJSONのフレームワークがあるかどうあまりにも難しいことではありませんその逆。

1

オブジェクトをExternalizableに実装し、シリアル化を完全に制御できます。例えばreadExternal/writeExternalのメソッドを実装する場合のJSONのgoogle-gson

1

、私はあなたがExternalizableインタフェースを実装し、メソッドの実装

public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException

public void writeExternal(ObjectOutput out) throws IOException

を提供することをお勧めします。その完全にあなた次第この場合、どのようにシリアライズしたいのですか。

関連する問題