Serializable java objects in MySQL

2 min read >

Serializable java objects in MySQL

Engineering Insights & Enterprise solutions

How to save a complex java object in a MySQL table
If you want to save complex java objects to MySQL you can serialize and save them as BLOB in a MySQL table.
For example, you have an object “complexObject” from class “ComplexObject” and you want to save it in the database.
The ComplexObject class must implement a Serializable interface and you can serialize the objects like this:

ByteArrayOutputStream baos;
ObjectOutputStream out;
baos = new ByteArrayOutputStream();
try {
out = new ObjectOutputStream(baos);
out.writeObject(complexObject);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
byte[] byteObject = baos.toByteArray();
to deserialize the object :
ByteArrayInputStream bais;
ObjectInputStream in;
try {
bais = new ByteArrayInputStream(byteObject);
in = new ObjectInputStream(bais);
complexObject = (ComplexObject) in.readObject();
in.close();
} catch (IOException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
The MySQL table looks like this:

CREATE TABLE myTable(
...
complexObject BLOB,...

);
If you use Hibernate and Annotation you declare the complexObject transient, and a byte[] byteObject that will be persisted:
@Entity
@Table(name = "myTable")
SomeClass{
private byte[] byteObject;
private ComplexObject complexObject;
...
@Transient
public ComplexObject getComplexObject() {
return complexObject;
}
public void setComplexObject(ComplexObject complexObject) {
this.complexObject = complexObject;
ByteArrayOutputStream baos;
ObjectOutputStream out;
baos = new ByteArrayOutputStream();
try {
out = new ObjectOutputStream(baos);
out.writeObject(complexObject);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
this.byteObject = baos.toByteArray();
}
@Column(columnDefinition = "blob")
public byte[] getByteObject() {
return byteObject;
}
public void setByteObject(byte[] byteObject) {
ByteArrayInputStream bais;
ObjectInputStream in;
try {
bais = new ByteArrayInputStream(byteObject);
in = new ObjectInputStream(bais);
complexObject = (ComplexObject) in.readObject();
in.close();
} catch (IOException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
this.byteObject= byteObject;
}
}

Attention the table column must be BLOB, not varchar.
Because the ComplexObject is transient it will not be saved in the database, but the byteObject will be saved.