S3に保存するために送信する前にバイト配列に変換したいX型のオブジェクトがあります。誰もこれを行う方法を教えてもらえますか?私はあなたの助けに感謝します。
やりたいことは、「 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 が必要なものに合うかもしれません。
commons-lang のserialize
でdeserialize
およびSerializationUtils
メソッドを使用します。
うん。 バイナリシリアル化 を使用するだけです。各オブジェクトに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);
}
}
ソース 。
他の同様の質問で述べたように、デフォルトのJavaシリアル化は少し冗長です。GZIPInput/ OutputStreamをオブジェクト間に配置することでデータを圧縮することを検討できます。ストリームとバイトストリーム。
オブジェクトをバイト配列に変換するには、Serialization and De-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?