Java: object to byte[] and byte[] to object converter (for Tokyo Cabinet)
JavaSerializationByteBytearrayTokyo CabinetJava Problem Overview
I need to convert objects to a byte[] to be stored in the Tokyo Cabinet key-value store. I also need to unbyte the byte[] to an Object when reading from the key-value store.
Are there any packages out there that will help me with this task? Or would the best solution to implement it myself?
Java Solutions
Solution 1 - Java
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();
}
Solution 2 - Java
If your class extends Serializable
, you can write and read objects through a ByteArrayOutputStream
, that's what I usually do.
Solution 3 - Java
Use serialize
and deserialize
methods in SerializationUtils
from commons-lang.
Solution 4 - Java
You can look at how Hector does this for Cassandra, where the goal is the same - convert everything to and from byte[]
in order to store/retrieve from a NoSQL database - https://github.com/hector-client/hector/tree/master/core/src/main/java/me/prettyprint/cassandra/serializers">see here. For the primitive types (+String), there are special Serializers, otherwise there is the generic ObjectSerializer
(expecting Serializable
, and using ObjectOutputStream
). You can, of course, use only it for everything, but there might be redundant meta-data in the serialized form.
I guess you can copy the entire package and make use of it.
Solution 5 - Java
You can use ObjectMapper
ObjectMapper objectMapper = new ObjectMapper();
ObjectClass object = objectMapper.readValue(data, ObjectClass.class);
Solution 6 - Java
If you do not want to serialize you can use object mapper
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
ByteArrayOutputStream out = new ByteArrayOutputStream();
objectMapper.writeValue(out,obj);
byte[] data = out.toByteArray();