在数据库中保留接口的 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
。当你不可避免地被要求这样做时,你可以以实用的方式从数据库中查询一些东西。
我想在关系数据库 (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
。当你不可避免地被要求这样做时,你可以以实用的方式从数据库中查询一些东西。