Преобразование любого объекта в байтовый массив в Java
У меня есть объект типа X, который я хочу преобразовать в байтовый массив перед отправкой для хранения в S3. Кто-нибудь может сказать мне, как это сделать? Я ценю вашу помощь.
5 ответов
То, что вы хотите сделать, называется " сериализация ". Есть несколько способов сделать это, но если вам не нужно ничего особенного, я думаю, что использование стандартной сериализации 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 может соответствовать тому, что вам нужно.
Использование serialize
а также deserialize
методы в SerializationUtils
из общего достояния
Да уж. Просто используйте двоичную сериализацию. Вы должны использовать каждый объект 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);
}
}
Как я уже упоминал в других подобных вопросах, вы можете рассмотреть возможность сжатия данных, поскольку сериализация 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?