У меня есть объект типа X, который я хочу преобразовать в массив байтов, прежде чем отправлять его для хранения в S3. Может ли кто-нибудь сказать мне, как это сделать? Я ценю вашу помощь.
Преобразование любого объекта в массив байтов в java
Ответ 1
Что вы хотите сделать, называется "serialization". Есть несколько способов сделать это, но если вам не нужно ничего интересного, я думаю, что использование стандартной сериализации Java было бы очень хорошо.
Возможно, вы могли бы использовать что-то вроде этого?
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();
}
}
}
}
Есть несколько улучшений, которые можно сделать. Не в последнюю очередь факт, что вы можете читать или записывать только один объект на каждый массив байтов, который может быть или не быть тем, что вы хотите.
Обратите внимание: "Только те объекты, которые поддерживают интерфейс java.io.Serializable
, могут быть записаны в потоки" (см. java.io.ObjectOutputStream
).
Поскольку вы можете столкнуться с этим, непрерывное распределение и изменение размера java.io.ByteArrayOutputStream
может оказаться довольно шеей бутылки. В зависимости от вашей модели потоков вы можете рассмотреть возможность повторного использования некоторых объектов.
Для сериализации объектов, которые не реализуют интерфейс Serializable
, вам нужно либо написать собственный сериализатор, например, используя методы read */write * java.io.DataOutputStream
и методы get */put * java.nio.ByteBuffer
, возможно, вместе с отражением или втянуть зависимость третьей стороны.
Этот сайт содержит список и сравнение производительности некоторых рамок сериализации. Глядя на API, кажется, Kryo может соответствовать тем, что вам нужно.
Ответ 2
Используйте методы serialize
и deserialize
в SerializationUtils
из commons-lang.
Ответ 3
Да. Просто используйте двоичную сериализацию. Вы должны использовать каждый объект implements Serializable
, но это прямо оттуда.
Другой вариант, если вы хотите избежать использования интерфейса 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
Как я уже упоминал в других похожих вопросах, вы можете рассмотреть возможность сжатия данных, поскольку сериализация Java по умолчанию является немного подробным. вы делаете это, помещая GZIPInput/OutputStream между потоками объектов и потоками байтов.
Ответ 5
Чтобы преобразовать объект в массив байтов, используйте концепцию 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?