Java class to byte array

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

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

Привет, я сделал. Проблема в том, что я могу добавить единственный способ — использовать имеющийся у нас внутренний API и использовать его для ввода данных. Мой объект генерируется во время выполнения и получает данные из другого объекта и не сериализуется. Спасибо за ответ

Ах, это делает это совсем другим вопросом! Вы действительно должны были упомянуть, что ваши объекты не являются Сериализуемыми в этом вопросе — потому что вы этого не сделали, все ответы, которые вы получили, включают стандартную сериализацию Java, которая неприменима. Возможно, вы захотите задать новый вопрос, например, «Как я могу сериализовать объекты, которые не реализуют Сериализуемый?». Часть байтового массива на самом деле не актуальна, если вы знаете, как записать поток в байтовый массив, и теперь вы читаете ответ Хенрика.

@BhartiRawat — вы читали любой из предыдущих комментариев? Кстати, «учебное пособие», которое вы связали, представляет собой отличный пример того, что НЕ нужно делать, вместе с необъяснимой попыткой обратного инжиниринга последовательного формата Java из потока, когда первый уже полностью задокументирован ObjectOutputStream и его друзьями.

Читайте также:  Ubuntu web server with php

5 ответов

Что вы хотите сделать, называется «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 может соответствовать тем, что вам нужно.

Привет еще раз спасибо Я не мог добиться этого, потому что объект имеет тип, который генерируется, и я не могу сделать его сериализуемым, как указал другой человек. API, который у меня уже есть, использует байтовый массив, и я не могу понять это. Есть ли другой способ или я что-то упустил?

Источник

How to Serialize/Deserialize Objects and Byte Arrays in Java

Given a serializable class, how can we convert the object state into a byte array byte[] ?

Classes that can be serialized need to implement the interface Serializable . These classes are then eligible to be converted to and from a byte stream.

Suppose we have a serializable object called SerDeObject .

class SerDeObject implements Serializable  /* Attributes and methods*/ > 

Serialization with ByteArrayOutputStream and try-with-resources

A clean way to convert an object into a byte array is to use the try-with-resources statement, which is a try statement that declares one or more resources.

A resource (i.e. ByteArrayOutputStream , ObjectOutputStream ) is an object that must be closed after the program is finished with it.

We can declare the two resources in the try statement and use a combination of writeObject() and toByteArray() to convert an object to a byte array.

private byte[] objectToByteArray(SerDeObject object) throws IOException  try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(bos))  out.writeObject(object); out.flush(); return bos.toByteArray(); > > 

Similarly, we can define ByteArrayInputStream , ObjectInputStream , and use readObject() to convert a byte array to an object.

private SerDeObject byteArrayToObject(byte[] bytes) throws IOException, ClassNotFoundException  try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes); ObjectInputStream in = new ObjectInputStream(bis))  return (SerDeObject) in.readObject(); > > 

Serialization with ByteArrayOutputStream and try-catch-finally

Note that the try-with-resources method only works with Java SE 7 and above. Prior to try-with-resources statements, we had to use a finally block to ensure that a resource is closed after a try or catch block.

Let’s serialize the object into a byte stream.

private byte[] objectToByteArray(SerDeObject object) throws IOException  ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream out; try  out = new ObjectOutputStream(bos); out.writeObject(object); out.flush(); return bos.toByteArray(); > finally  bos.close(); > > 

We can easily perform the opposite functionality as well.

private SerDeObject byteArrayToObject(byte[] bytes) throws IOException, ClassNotFoundException  ByteArrayInputStream bis = new ByteArrayInputStream(bytes); ObjectInput in = null; try  in = new ObjectInputStream(bis); return (SerDeObject) in.readObject(); > finally  if (in != null)  in.close(); > > > 

Serialization with SerializationUtils

Converting to a byte array is super simple using serialize() .

private byte[] objectToByteArray(SerDeObject object)  return SerializationUtils.serialize(object); > 

Converting back to an object is just as easy using deserialize() .

private SerDeObject byteArrayToObject(byte[] bytes)  return SerializationUtils.deserialize(bytes); > 

Serialization with Jackson

We can also use Jackson’s writeValueAsBytes() to serialize an object as a byte array.

private byte[] objectToByteArray(SerDeObject object) throws JsonProcessingException  return new ObjectMapper().writeValueAsBytes(object); > 

We can deserialize using readValue() .

private SerDeObject byteArrayToObject(byte[] bytes) throws IOException  return new ObjectMapper().readValue(bytes, SerDeObject.class); > 

Источник

Converting Java Objects to Byte Array, JSON and XML

Join the DZone community and get the full member experience.

Converting a Java object (a process known as serialization) to various forms such as XML, JSON, or a byte array and back into java objects is a very common requirement. This post is intended to be a quick reference for you to easily make these conversions.

Java Object to Byte Array and Back

Lets start by converting a java object into a byte array and back. The library we will be using to achieve this result is the commons lang library which you can get using the following maven dependency.

 commons-lang commons-lang 2.6 

The following two functions convert a java object to a byte array and back to java object respectively. You will need the following import:

import org.apache.commons.lang.SerializationUtils;

/** * Convert object to byte array * @param object * @return */ public static byte[] fromJavaToByteArray(Serializable object) < return SerializationUtils.serialize(object); >/** * Convert byte array to object * @param bytes * @return */ public static Object fromByteArrayToJava(byte[] bytes)

Java Object to JSON and Back

Next, we will convert a java object to JSON and back to java. We will use the Jackson library for this. Use the following maven dependency.

 org.codehaus.jackson jackson-mapper-asl 1.9.12 

The functions that perform the conversions.

/** * Convert object to JSON String * @param object * @return * @throws JsonGenerationException * @throws JsonMappingException * @throws IOException */ public static String fromJavaToJson(Serializable object) throws JsonGenerationException, JsonMappingException, IOException < ObjectMapper jsonMapper = new ObjectMapper(); return jsonMapper.writeValueAsString(object); >/** * Convert a JSON string to an object * @param json * @return * @throws JsonParseException * @throws JsonMappingException * @throws IOException */ public static Object fromJsonToJava(String json, Class type) throws JsonParseException, JsonMappingException, IOException

Java Object to XML and Back

We will use Xstream from thoughtworks to serialize to XML. Include the following maven dependency.

 com.thoughtworks.xstream xstream 1.4.4 

And the one-liners to perform the conversions.

/** * Convert a java object to XML * @param object * @return */ public static String fromJavaToXML(Serializable object) < XStream xs = new XStream(); return xs.toXML(object); >/** * Convert from XML to object * @param xml * @return */ public static Object fromXMLToJava(String xml)

Published at DZone with permission of Faheem Sohail , DZone MVB . See the original article here.

Opinions expressed by DZone contributors are their own.

Источник

Преобразование объекта в байт[] в Java

В этой статье показано, как преобразовать объект в “байт[]” или массив байтов и наоборот в Java.

В этой статье показано, как преобразовать объект в байт[] или массив байтов и наоборот в Java.

1. Преобразование объекта в байт[]

В приведенном ниже примере показано, как использовать ByteArrayOutputStream и ObjectOutputStream для преобразования объекта в байт[] .

// Convert object to byte[] public static byte[] convertObjectToBytes(Object obj) < ByteArrayOutputStream boas = new ByteArrayOutputStream(); try (ObjectOutputStream ois = new ObjectOutputStream(boas)) < ois.writeObject(obj); return boas.toByteArray(); >catch (IOException ioe) < ioe.printStackTrace(); >throw new RuntimeException(); > // Convert object to byte[] public static byte[] convertObjectToBytes2(Object obj) throws IOException < ByteArrayOutputStream boas = new ByteArrayOutputStream(); try (ObjectOutputStream ois = new ObjectOutputStream(boas)) < ois.writeObject(obj); return boas.toByteArray(); >>

2. Преобразовать байт[] возражать

В приведенном ниже примере показано, как использовать ByteArrayInputStream и ObjectInputStream для преобразования байт [] вернуться к объекту.

// Convert byte[] to object public static Object convertBytesToObject(byte[] bytes) < InputStream is = new ByteArrayInputStream(bytes); try (ObjectInputStream ois = new ObjectInputStream(is)) < return ois.readObject(); >catch (IOException | ClassNotFoundException ioe) < ioe.printStackTrace(); >throw new RuntimeException(); > // Convert byte[] to object public static Object convertBytesToObject2(byte[] bytes) throws IOException, ClassNotFoundException < InputStream is = new ByteArrayInputStream(bytes); try (ObjectInputStream ois = new ObjectInputStream(is)) < return ois.readObject(); >> // Convert byte[] to object with filter public static Object convertBytesToObjectWithFilter(byte[] bytes, ObjectInputFilter filter) < InputStream is = new ByteArrayInputStream(bytes); try (ObjectInputStream ois = new ObjectInputStream(is)) < // add filter before readObject ois.setObjectInputFilter(filter); return ois.readObject(); >catch (IOException | ClassNotFoundException ioe) < ioe.printStackTrace(); >throw new RuntimeException(); >

Скачать Исходный Код

Рекомендации

Источник

Оцените статью