在数据库中保留接口的 Java 个实例

Persist a Java instance of an Interface in a database

我想在关系数据库 (PostgreSQL) 中保留一个对象。具体要持久化的对象我不知道class,只知道它实现了一个接口

最好的方法是什么?

我想做类似的事情:

Interface obj = new InterfaceImpl();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(buffer);
oos.writeObject(obj);
oos.close();
byte[] rawData = buffer.toByteArray();

String base64String = Base64.encodeBase64String(bytes);
//Persist the string to DB


//Load string from db
byte[] backToBytes = Base64.decodeBase64(base64String);
ByteArrayInputStream in = new ByteArrayInputStream(data);
ObjectInputStream is = new ObjectInputStream(in);
Interface obj = (Interface) is.readObject();

有更好的解决方案吗?

如果这就是您对对象的全部了解,那么您真正能做的就是将它存储在 bytea 字段中,并在以后需要时再次检索它。

使用 bytea 而不是 text。与 text.

不同,二进制数据(无排序规则或自然语言支持)速度更快,并且支持存储零(空)字节

这绝对是在数据库中存储数据的最后手段。它 总是 会导致疼痛。有人会过来问 "ok, now write a query where you find all objects of type com.mycompany.Apple with their colour property set to "red". You will have to reply "对不起,我不能那样做,数据库只会看到一堆二进制乱码。你会被告知 "Do it anyway" .所以你从数据库中读取每个对象,反序列化它,检查它的类型,通过反射检查它的属性并根据结果丢弃它或保留它。数据库变大了,这变得越来越慢。所以你开始添加列来缓存有关数据库中对象的信息,但随后它们开始与存储的数据不同步,因为某些代码忘记更新它们...

我之前编写过在 bytea 字符串中搜索的查询,以手动反序列化和检查 Java 对象的部分内容。可怕的东西。不推荐。

如果可能的话,请使用更实用的对象结构序列化,例如 json。当你不可避免地被要求这样做时,你可以以实用的方式从数据库中查询一些东西。