web-dev-qa-db-ja.com

任意のオブジェクトを文字列に確実に変換してから再び戻す

オブジェクトを文字列に変換してから同じオブジェクトに戻す信頼できる方法はありますか? toString()を使用してそれらを変換し、その値をコンストラクターに渡してオブジェクトを再構築する人々の例をいくつか見ましたが、すべてのオブジェクトがこのようなコンストラクターを持っているわけではないため、メソッドはすべての場合に機能しません。どうする?

36
user596186

はい、それは serialization !と呼ばれます!

 String serializedObject = "";

 // serialize the object
 try {
     ByteArrayOutputStream bo = new ByteArrayOutputStream();
     ObjectOutputStream so = new ObjectOutputStream(bo);
     so.writeObject(myObject);
     so.flush();
     serializedObject = bo.toString();
 } catch (Exception e) {
     System.out.println(e);
 }

 // deserialize the object
 try {
     byte b[] = serializedObject.getBytes(); 
     ByteArrayInputStream bi = new ByteArrayInputStream(b);
     ObjectInputStream si = new ObjectInputStream(bi);
     MyObject obj = (MyObject) si.readObject();
 } catch (Exception e) {
     System.out.println(e);
 }
61
Andrew

これはコードです:

try {
    ByteArrayOutputStream bo = new ByteArrayOutputStream();
    ObjectOutputStream so = new ObjectOutputStream(bo);
    so.writeObject(stringList);
    so.flush();
    redisString = new String(Base64.encode(bo.toByteArray()));       
} 
catch (Exception e) {
    e.printStackTrace();
}

try {
    byte b[] = Base64.decode(redisString.getBytes()); 
    ByteArrayInputStream bi = new ByteArrayInputStream(b);
    ObjectInputStream si = new ObjectInputStream(bi);
    List<String> stringList2 = (List<String>)si.readObject();
    System.out.println(stringList2.get(1));          
} 
catch (Exception e) {
    e.printStackTrace();         
}
15
Ashwini Adlakha

シリアル化 バイト配列に変換し、Base64に変換します。次に、 Base64 をデコードしてバイト配列に戻し、逆シリアル化します。

12

すべての場合では動作しません.

あなたが会おうとしている追加の問題には、オープンストリーム、リスニングソケット、および外界からのほとんどすべてのものが含まれます。

繰り返す必要はありません 最も 少なくとも2つのJavaコアエンジニアは、シリアル化は 最大の間違いの一つ Javaの1つの最悪の機能、つまり、ファイナライズ後。 (それでもシリアル化は大好きですが、便利です。しかし、常に動作しません。)

5
alf

はい、シリアル化 ObjectInputStream.readObjectおよびObjectOutputStream.writeObjectを使用できます。以下の例をご覧ください。

MyClass myClass = new MyClass();
FileOutputStream fileStream = new FileOutputStream("myObjectFile.txt");
ObjectOutputStream os = new ObjectOutputStream(fileStream);
os.writeObject(os);
os.close();

FileInputStream fileInStream = new FileInputStream("myObjectFile.txt");
ObjectInputStream ois = new ObjectInputStream(fileInStream);
MyClass myClass2 = ois.readObject();
ois.close();
3
HRgiger

1つの方法はJSONを使用することです。 Java固有の実装については、この投稿で答えが得られる可能性があります。

Newtonsoft.Json.JsonConvert.SerializeObject(.net?のObject source、Newtonsoft.Json.JsonSerializerSettings())に対応するJavaコード

JSONの使用は十分に信頼性が高く、Webアプリケーション開発(Ajax)に使用されます。

3