繁体   English   中英

java:为什么ResultSet不是Serializable?

[英]java: Why ResultSet is not Serializable?

经过几个小时的搜索,我终于意识到java.sql.ResultSet不是Serializable,也没有办法做到这一点。 我尝试添加到List,作为Serializable对象中的实例变量和其他东西,但事情结果是天真和绝望的尝试。 我尝试使用RowSet的实现,如CachedRowSetImpl ,它们是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的能力),而不是序列化(或可序列化)。 也就是说,如果在实现方面有足够的限制(比如不使用更新方法,并禁用流功能),那么肯定可以进行可序列化的实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM