web-dev-qa-db-ja.com

javaでオブジェクトをバイト配列に変換する

S3に保存するために送信する前にバイト配列に変換したいX型のオブジェクトがあります。誰もこれを行う方法を教えてもらえますか?私はあなたの助けに感謝します。

48
Hari

やりたいことは、「 serialization 」と呼ばれます。いくつかの方法がありますが、空想が必要ない場合は、 standard Java object serialization を使用するとうまくいくと思います。

おそらくこのようなものを使用できますか?

package com.example;

import Java.io.ByteArrayInputStream;
import Java.io.ByteArrayOutputStream;
import Java.io.IOException;
import Java.io.ObjectInputStream;
import Java.io.ObjectOutputStream;

public class Serializer {

    public static byte[] serialize(Object obj) throws IOException {
        try(ByteArrayOutputStream b = new ByteArrayOutputStream()){
            try(ObjectOutputStream o = new ObjectOutputStream(b)){
                o.writeObject(obj);
            }
            return b.toByteArray();
        }
    }

    public static Object deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
        try(ByteArrayInputStream b = new ByteArrayInputStream(bytes)){
            try(ObjectInputStream o = new ObjectInputStream(b)){
                return o.readObject();
            }
        }
    }

}

これにはいくつかの改善点があります。少なくとも、バイト配列ごとに1つのオブジェクトしか読み取り/書き込みできないという事実ではありません。

Java.io.Serializable インターフェイスをサポートするオブジェクトのみがストリームに書き込むことができます」( Java.io.ObjectOutputStream を参照)。

あなたはそれに出くわすかもしれないので、 Java.io.ByteArrayOutputStream の継続的な割り当てとサイズ変更は、かなりボトルネックであることが判明するかもしれません。スレッドモデルに応じて、一部のオブジェクトの再利用を検討することをお勧めします。

Serializableインターフェイスを実装しないオブジェクトのシリアル化では、たとえば Java.io.DataOutputStream のread */write *メソッドを使用して、独自のシリアライザーを記述する必要があります。 Java.nio.ByteBuffer のget */put *メソッドと、おそらくリフレクションを併用するか、サードパーティの依存関係を取り込みます。

このサイト には、いくつかのシリアル化フレームワークのリストとパフォーマンスの比較があります。 APIを見ると、 Kryo が必要なものに合うかもしれません。

102

commons-langserializedeserializeおよびSerializationUtilsメソッドを使用します。

5
SANN3

うん。 バイナリシリアル化 を使用するだけです。各オブジェクトにimplements Serializableを使用させる必要がありますが、そこからは簡単です。

もう1つのオプションは、Serializableインターフェースの実装を避けたい場合、リフレクションを使用し、以下のプロセスを使用してバッファーとの間でデータを読み書きします。

/** 
 * Sets all int fields in an object to 0.
 *
 * @param obj The object to operate on.
 *
 * @throws RuntimeException If there is a reflection problem.
 */
 public static void initPublicIntFields(final Object obj) {
    try {
       Field[] fields = obj.getClass().getFields();
       for (int idx = 0; idx < fields.length; idx++) {
          if (fields[idx].getType() == int.class) {
              fields[idx].setInt(obj, 0);
          }
       }
    } catch (final IllegalAccessException ex) {
       throw new RuntimeException(ex);
    }
 }

ソース

4
Paul Sasik

他の同様の質問で述べたように、デフォルトのJavaシリアル化は少し冗長です。GZIPInput/ OutputStreamをオブジェクト間に配置することでデータを圧縮することを検討できます。ストリームとバイトストリーム。

3
jtahlborn

オブジェクトをバイト配列に変換するには、Serialization and De-serializationの概念を使用します。

オブジェクトからバイト配列への完全な変換はチュートリアルです。

http://javapapers.com/core-Java/java-serialization/

Q. How can we convert object into byte array?

Q. How can we serialize a object?

Q. How can we De-serialize a object?

Q. What is the need of serialization and de-serialization?
0
Bharti Rawat