Подтвердить что ты не робот

Преобразование любого объекта в массив байтов в java

У меня есть объект типа X, который я хочу преобразовать в массив байтов, прежде чем отправлять его для хранения в S3. Может ли кто-нибудь сказать мне, как это сделать? Я ценю вашу помощь.

4b9b3361

Ответ 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.

Полное преобразование из массива объектов в байтовый объясняется в руководстве.

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?