java:为什么ResultSet不是Serializable?

时间:2014-07-21 16:27:17

标签: java sql serialization jdbc

经过几个小时的搜索后,我终于意识到java.sql.ResultSet不是Serializable,也没有办法做到这一点。我尝试添加到List,作为Serializable对象中的实例变量和其他东西,但事情结果是天真和绝望的尝试。我尝试使用RowSet的实现,如CachedRowSetImpl,它们是Serializable但是它们会增加响应时间,这很可能是因为它们迭代了ResultSet。 最重要的是,除非您选择迭代ResultSet,否则您无法通过网络发送它包含的数据。

我知道我必须迭代并将内容添加到数据模型对象和列表中的替代方案,但我绝望地想知道这背后的理性是什么?那时java的开发人员想到了什么?

2 个答案:

答案 0 :(得分:7)

据我所知,ResultSet没有"包含"数据。 如果您调用http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#next(),ResultSet将从基础(JDBC)连接获取数据到数据库。

如果ResultSet被序列化并转移到另一台计算机,那么这是不可能的。那里连接不可用。

答案 1 :(得分:0)

我无法回答原始开发人员的想法,但是界面的设计清楚地暴露了一些元素。

首先,让我们注意ResultSet是一个接口,设计者并不打算将其序列化。

但是,ResultSet仍然是如此强大的界面,它通常可序列化几乎没有意义。 几个例子。

  1. ResultSet参与transactionnal行为。如果要对结果集进行序列化,并将其发送到其他地方(通过RMI发送到文件,另一个JVM ......)原始事务会发生什么?
  2. ResultSet允许直接更新行中的列,甚至行删除。如果要将结果集序列化并发送到其他地方,那该怎么办?
  3. ResultSet允许某些类型的列(* LOB)的流式传输。流媒体如何在seriliazable环境中工作?
  4. 当(de)序列化时,这样的方法如何刷新?
  5. 当您考虑ResultSet序列化时,会出现一些非平凡的问题。

    在我看来,ResultSet被设计并以某种方式进行了优化,以反映与关系数据库的直接 live 连接,而不是一组“可移植”数据

    上面的例子清楚地表明,一旦反序列化,可序列化的ResultSet实现可能会限制其实现(更新方法基本上是无操作)。

    另外,尝试序列化结果集的内容似乎不可避免地意味着需要“以某种方式”迭代它:内容不可避免地与resultSet中所有数据的获取相关联(也许实现者可以优化过程,因此为了不完全解析它,只获取数据库的原始字节,但你仍然需要获取数据以便序列化它们。)

    因此,我认为ResultSet接口的设计者和大多数实现者更关心ResultSet的 live 方面(使用更新方法参与transactionnal行为和writeBack到DB的能力)而不是它的序列化(或可序列化)。 也就是说,如果对实现有足够的限制(比如不使用更新方法和禁用流功能),那么可以进行可序列化的实现。