Преобразование любого объекта в байтовый массив в Java - PullRequest
48 голосов
/ 30 апреля 2011

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

Ответы [ 5 ]

102 голосов
/ 30 апреля 2011

То, что вы хотите сделать, называется " сериализация ".Есть несколько способов сделать это, но если вам не нужно ничего необычного, я думаю, что использование стандартной сериализации 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 может соответствовать тому, что вам нужно.

5 голосов
/ 31 марта 2014

Используйте serialize и deserialize методы в SerializationUtils из commons-lang .

4 голосов
/ 30 апреля 2011

Да. Просто используйте двоичная сериализация . Вам нужно, чтобы каждый объект использовал 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);
    }
 }

Источник .

3 голосов
/ 30 апреля 2011

Как я уже упоминал в других подобных вопросах, вы можете рассмотреть возможность сжатия данных, поскольку сериализация Java по умолчанию немного многословна. Вы делаете это, помещая GZIPInput / OutputStream между потоками объекта и байтовыми потоками.

0 голосов
/ 06 мая 2016

Чтобы преобразовать объект в байтовый массив , используйте концепцию 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?
...