2012-03-08 5 views
0

シリアライゼーションを使用して、ユーザーによって変更されたBeanを保存することを計画しています。しかし、ByteArrayOutputStreamはバイト配列byte []を出力します。それをStringに変換して元に戻すと、逆シリアル化できません。 - これを説明する方法? バイト配列を使用してOracleに格納する場合、複雑です。文字列をデシリアライズする方法はありますか?ありがとうございました! 私は中国人ですので、私の悪い英語のために私を許してください。オブジェクトをデシリアライズするシリアライズしObjectInputStreamする:)Javaシリアル化を使用してオブジェクトを保存する

+0

あなたのアプローチを示す短いコードスニペットがありますか?私は文字エンコーディングがここで問題であると確信しています。 –

+0

文字列がbyte []ではないため、文字列へのシリアライズは正しく動作しません。あなたはbase64エンコーディングを使ってバイトをStringに保存することができます。しかし、問題は、バイト[]による永続性は良い考えではなく、多くの問題の影響を受けやすいことです。 ORMを使用するか、Beanを検査してフィールドを保存するか、JSONなどのより良いシリアル化を使用する必要があります。 – Viruzzo

答えて

2

使用ObjectOutputStream。これらのクラスのAPIドキュメントには、ファイルを使用してオブジェクトを直列化および逆シリアル化する方法の例があります。

Stringbyte[]を強制しようとしないでください。 (なぜあなたはそれをStringに入れたいのですか?)。シリアライズされたオブジェクトは、バイナリデータであり、Stringに格納するテキスト文字ではありません。バイトで

+0

ありがとうございました!プロジェクトは、DBにオブジェクトを格納する必要があるので、私はJSONのような他の方法を使用しようとしています。再度、感謝します! –

+0

オブジェクトをJSON形式で保存する必要がある場合、Javaのシリアル化メカニズムは使用するものではありません。 [Google GSON](http://code.google.com/p/google-gson/)などのライブラリを使用してください。 – Jesper

+0

私はプロジェクトでGSONを使用する準備ができて、あなたの助言は便利です!ありがとう! –

0

[]は、すべての可能なバイト値は、テキスト内の値のこれらの値との組み合わせが無効であると予想されるようにテキストに変換することができない、しかし127に、すなわち-128を使用することができます。

私はあなたがXMLやJSONなどのテキストベースのシリアル化を検討し提案します。これらはテキストとして安全に読み書きできます。テキストベースのシリアライゼーションは人間が読むことができ、値を修正したい場合はテキストとして編集することができます。


編集:私は、粗であるXMLEncoderを使用して見ますが、XMLとJSONのためにまたはXStream建てでしょう、より柔軟かつ効率的である(ただし、余分なライブラリのカップルが必要です)

+0

あなたのアドバイスは素晴らしいです。ありがとう! –

0

ブリーフ回答:バイト配列をBase64文字列としてエンコードします。

Base64では、バイナリデータが格納され、テキストとして送信することができることを保証する方法である - 合理的な説明がWikipediaで見つけることができます。バイト配列をエンコードしないと、データは異なるコードページなどを使用することによって簡単に「壊れた」状態になります。注意しなければならないことは、base64エンコーディングはバイト配列よりも多くの領域を占有することになります(バイト配列20バイト)保存する

を約30文字がかかる場合がありますエンコード/ Base64でApache Commons Codecをデコードすることができ、多くのライブラリがあります。一つだけです。使用するライブラリの詳細については、this questionを参照してください(JDKには「プライベート」のライブラリがありますが、その使用は一部の開発者にとっては疑わしいと思われるかもしれません)。

だから、要約すると、文字列にオブジェクトをシリアル化するために、私たちObjectOutputStreamByeArrayOutputStreamバイト配列に変換し、文字列にそれを翻訳するのBase64エンコーダを使用します。

逆シリアル化を行うには、Base64デコーダを使用して文字列をバイト配列に変換してから、ByteArrayInputStreamObjectInputStreamを使用して読み込みます。

+0

ありがとうございます.Gsonを使って対処します。 –

0
 static final String SQL_SERIALIZE_OBJECT="insert into serialized_java_objects(serialized_id,object_name,serialized_object) values (ser_id_seq.nextval,?,?)"; 

     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(baos); 
     oos.writeObject(objectToBeSerilize); 
     byte[] serializeBytes = baos.toByteArray(); 

     prepStatement = connection.prepareStatement(SQL_SERIALIZE_OBJECT); 
     prepStatement.setString(1, objectToBeSerilize.getClass().getName()); 
     prepStatement.setBytes(2, serializeBytes); 


     prepStatement.executeUpdate(); 
関連する問題