我目前正在研究Java序列化。但是,我仍然对其实用性感到困惑。一般来说,与直接在各种数据库列中存储数据相比,我们何时应该使用序列化?
答案 0 :(得分:3)
我认为您将序列化与读取和写入数据库的对象混淆。
正如本回答中所解释的那样Do Hibernate table classes need to be Serializable? JPA对象(hibernate)应该实现Serializable
,以便可以通过RMI将分离的实体发送到应用程序的其他层。
这与Hibernate如何读取和写入数据库数据无关。只要你不使用分离的对象,你就可以在没有实体实现Serializable
的情况下逃脱,而hibernate仍然可以正常工作。
Hibernate通过JDBC读取和写入数据库,就像您自己编写SQL查询一样。如果您想了解有关hibernate如何将对象字段转换为JDBC方法的更多信息,您可以从查看Hibernate UserType开始。 Hibernate默认带有许多内置的用户类型,可以将ResultSet
,String
,Date
类型的int
列转换为数据库或从数据库转换。如果你需要自己编写自己的UserTypes,你只需要编写自己的UserType实现,这非常简单。
答案 1 :(得分:1)
Hibernate增强的类实际上可以是Serializable
。但是,在使用之前,您应该考虑所有结果。您可能会遇到这些问题:
@Json*
注释)要了解这些问题,您需要了解Hibernate的实际工作方式。
增强功能允许实体部分加载。例如,您希望获得给定用户的所有书籍。你得到了一系列书籍,但你真正拥有的是 hibernate-enhanced classes 的集合,目前只包装ID。前提是您使用默认的延迟加载。
除非您确实需要ID以外的其他内容,否则将永远不会加载数据。在getter调用时,如果需要,将进行后台查询以获取额外信息。
现在,假设一个用户拥有他所有书籍的集合,作为一个字段。当从DB延迟加载时,可能根本没有任何东西。但是,如果你想序列化它,所有的getter都被称为,如果书籍与其作者有关系,你会得到所有书籍和传递,每本书的作者...
如果关系在类中是双向的,你甚至可以创建一个循环,它会导致堆栈溢出错误,你可以在哪里查看该书的所有者,然后再为他取书。