Java:对象转换为byte[]和byte[]转换为对象转换器(用于Tokyo Cabinet)

72

我需要将对象转换为byte[]以便存储在东京柜子键值存储中。我还需要将byte []反序列化为对象,以便在从键值存储中读取时使用。

是否有任何包可以帮助我完成这个任务?或者最好的解决方案是自己实现?


3
让你的类实现 Serializable 接口,然后使用 Java Serializable Object to Byte Array 中提供的方法将对象序列化为字节数组。 - Matthew Flaschen
它不是完全重复的,尽管看起来是这样的。 - Bozho
如果对象不是可序列化的,而是可解包或一个包裹,则可以使用marshallunmarshall方法。请参见(https://dev59.com/22Ml5IYBdhLWcg3w76sI#18000094)。 - Bruno L.
6个回答

174
public static byte[] serialize(Object obj) throws IOException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ObjectOutputStream os = new ObjectOutputStream(out);
    os.writeObject(obj);
    return out.toByteArray();
}
public static Object deserialize(byte[] data) throws IOException, ClassNotFoundException {
    ByteArrayInputStream in = new ByteArrayInputStream(data);
    ObjectInputStream is = new ObjectInputStream(in);
    return is.readObject();
}

21
在内存流的情况下,不需要使用"is.close"和"in.close",因为它们只会使代码变得更慢、更啰嗦。但是我理解IDE可能会标记上面的代码,因为流没有被关闭。 - Thomas Mueller
3
我认为它不会变慢,因为这只是一个空方法,所以时间差异必须非常小。但你是对的:“关闭 ByteArrayOutputStream 没有影响” Java Doc。太棒了 :D - Cacho Santa
1
@ThomasMueller 很不幸,“os.writeObject(obj);”会导致NotSerializableException,因为InputStream没有实现Serializable接口 =( - Arthur Eirich
如果对象是Parcelable,那么解决方案是什么? - Zala Janaksinh
@ZalaJanaksinh 这是一个不同的问题。这个问题是关于Java,而不是Android。 - Thomas Mueller
显示剩余10条评论

14

如果您的类继承了 Serializable 接口,您就可以通过使用 ByteArrayOutputStream 写入和读取对象,这是我通常所做的。


3
你的类中包含的所有类型(以及这些类型中的所有类型,以此类推)也需要是可序列化的。 - Dean J
实际上,他还需要一个ObjectOutputStream来包装BAOS...但是,没错,这是最简单的方法。 - Aviad Ben Dov
我会考虑使用除Java内置序列化之外的其他东西,例如JBoss序列化、JSerial、Avro等,或者像XStream或Javolution marshalling加上gzip这样的XML格式。标准序列化并不特别快,尽管它的边际空间效率很好,但有相当多的每个流开销。 - Tom Anderson

11
使用来自commons-langSerializationUtils中的serializedeserialize方法。请注意,保留了HTML标签且没有解释性文本。

6

您可以使用ObjectMapper

        ObjectMapper objectMapper = new ObjectMapper();
        ObjectClass object = objectMapper.readValue(data, ObjectClass.class);

5
您可以参考 Hector 在 Cassandra 中的实现,目标是将所有内容转换为byte[]以便存储/检索 NoSQL 数据库 - 请点击这里。对于基本类型(+String),有特殊的序列化器,否则使用通用的ObjectSerializer(期望Serializable并使用ObjectOutputStream)。当然,您可以仅使用它来处理所有内容,但序列化形式中可能存在冗余元数据。
我猜您可以复制整个包并加以利用。

链接已损坏! - tgabb

0
如果您不想进行序列化,可以使用对象映射器。
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());

ByteArrayOutputStream out = new ByteArrayOutputStream();
objectMapper.writeValue(out,obj);
byte[] data = out.toByteArray();

我们什么时候应该实现Serializable接口?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接