在Java中将任何对象转换为字节数组
我有一个typesX的对象,我想要转换成字节数组之前发送它存储在S3中。 有谁能告诉我该怎么做? 我感谢您的帮助。
- NewtonSoft.Json使用IEnumerable <ISomeInterface>types的属性对类进行序列化和反序列化
- 在Python中,json序列化是如何比yaml序列化更快的呢?
- 用Gson序列化和反序列化枚举
- 通过自定义属性(json.net)从序列化中排除属性
- 如何将ArrayList <CustomeObject>从一个活动传递给另一个?
你想要做的就是所谓的“ 序列化 ”。 有几种方式,但是如果你不需要任何东西,我想用标准的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?