java:为什么ResultSet不是Serializable?

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

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

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

如果ResultSet是序列化并传输到另一台计算机,则这是不可能的。 那里的连接将无法使用。

我不能回答原始开发人员的想法,但是一些元素通过界面的设计清楚地暴露出来。

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

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

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

这些是您考虑ResultSet序列化时出现的一些非平凡问题。

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

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

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

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