69

我需要将对象转换为要存储在 Tokyo Cabinet 键值存储中的 byte[]。从键值存储读取时,我还需要将 byte[] 转换为 Object 。

是否有任何软件包可以帮助我完成这项任务?还是自己实施它的最佳解决方案?

4

6 回答 6

169
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();
}
于 2010-09-17T14:33:15.190 回答
14

如果你的类 extends Serializable,你可以通过 a 读写对象ByteArrayOutputStream,这就是我通常做的。

于 2010-09-17T14:14:20.897 回答
11

来自commons-lang的使用serializedeserialize方法。SerializationUtils

于 2014-03-31T05:16:36.477 回答
5

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

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

于 2010-09-17T14:14:25.563 回答
2

您可以使用 ObjectMapper

        ObjectMapper objectMapper = new ObjectMapper();
        ObjectClass object = objectMapper.readValue(data, ObjectClass.class);
于 2020-12-23T12:28:07.927 回答
0

如果您不想序列化,可以使用对象映射器

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());

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

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

于 2021-06-24T07:40:46.073 回答