在Java中将任何对象转换为字节数组
我有一个typesX的对象,我想要转换成字节数组之前发送它存储在S3中。 有谁能告诉我该怎么做? 我感谢您的帮助。
你想要做的就是所谓的“ 序列化 ”。 有几种方式,但是如果你不需要任何东西,我想用标准的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
接口的对象才能写入stream”(请参阅java.io.ObjectOutputStream
)。
既然你可能会遇到它, java.io.ByteArrayOutputStream
的连续分配和resize可能会成为瓶颈。 根据您的线程模型,您可能需要考虑重用一些对象。
对于没有实现Serializable
接口的对象的Serializable
您需要编写自己的序列化程序,例如使用java.io.DataOutputStream
的read * / write *方法和java.nio.ByteBuffer
的get * / put *方法也许与反思一起,或者拉第三方的依赖。
这个网站有一些序列化框架的列表和性能比较。 看看APIs似乎Kryo可能适合你需要的东西。
在commons-lang的 SerializationUtils
使用serialize
和deserialize
方法。
正如我在其他类似的问题中提到的,您可能需要考虑压缩数据,因为默认的Java序列化有点冗长。 你可以通过在Objectstream和Bytestream之间放置一个GZIPInput / OutputStream来实现。
是啊。 只要使用二进制序列化 。 你必须让每个对象都使用implements Serializable
但是从那里直接就可以了。
如果你想避免实现Serializable接口,你的另一个select是使用reflection,并使用下面的过程从缓冲区读写数据:
/** * 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); } }
来源 。
要将对象转换为字节数组,请使用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?
- 在Java中扩展Serializable类时,是否为serialVersionUIDselect了什么?
- “Type not expected”,使用DataContractSerializer – 但它只是一个简单的类,没有有趣的东西?
- 在Java中序列化对象时的StackOverflowError
- 了解护照序列化反序列化
- 如何使$ .serialize()考虑到那些禁用:input元素?
- Django rest框架,在同一个ModelViewSet中使用不同的序列化器
- 具有多态子对象的Json.Net序列化
- C#通过TCP接收它后反序列化结构
- Jackson ObjectMapper – 指定对象属性的序列化顺序