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

vol*_*lni 62 java serialization byte bytearray tokyo-cabinet

我需要将对象转换为byte []以存储在Tokyo Cabinet键值存储中.当从键值存储区读取时,我还需要将byte []取消对象.

那里有什么包可以帮我完成这项任务吗?或者是我自己实施的最佳解决方案?

Tho*_*ler 155

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();
}
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,不需要`is.close`和`in.close`,因为它是内存中的流.它唯一能做的就是让它变得更慢,更冗长.但我知道IDE可能会标记上面的代码,因为流未关闭. (20认同)
  • 我不认为它会变慢,它只是一个空方法所以时间差必须非常低.但你是对的:`关闭ByteArrayOutputStream没有效果.[Java Doc](http://docs.oracle.com/javase/6/docs/api/java/io/ByteArrayOutputStream.html#close%28%29 )太棒了:D (3认同)

G B*_*G B 12

如果你的类扩展了Serializable,你可以通过a来编写和读取对象ByteArrayOutputStream,这就是我通常所做的.

  • 包含在类中的变量(以及这些类型中的所有类型,等等)的所有类型也需要是Serializable. (3认同)

SAN*_*NN3 9

来自commons-lang的用法serializedeserialize方法.SerializationUtils


Boz*_*zho 5

您可以查看Hector如何为Cassandra执行此操作,目标是相同的 - 将所有内容转换为byte[]来自NoSQL数据库的存储/检索 - 请参阅此处.对于原始类型(+ String),有特殊的Serializers,否则有泛型ObjectSerializer(期望Serializable和使用ObjectOutputStream).当然,您可以仅将其用于所有内容,但序列化形式中可能存在冗余的元数据.

我想你可以复制整个包并使用它.


S. *_* Du 5

您可以使用对象映射器

        ObjectMapper objectMapper = new ObjectMapper();
        ObjectClass object = objectMapper.readValue(data, ObjectClass.class);
Run Code Online (Sandbox Code Playgroud)