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.

Unlock innovation and digital transformation for your business.

Get in touch

We are always happy to talk

Phone

+40-21-223-7700

Email

hello@tremend.com

Address

165 Splaiul Unirii, Timpuri Noi Square,
TN Office 2 building, 4th floor,
District 3, Bucharest, Romania, 030134