java:为什么ResultSet不可序列化?

java:为什么ResultSet不可序列化?,java,sql,serialization,jdbc,Java,Sql,Serialization,Jdbc,经过数小时的搜索,我终于意识到这是不可序列化的,也没有办法做到这一点。我尝试将其添加到列表中,作为可序列化对象中的实例变量和其他内容,但结果证明这是天真和绝望的尝试。我尝试使用类似的可序列化实现,但它们增加了响应时间,很可能是因为它们迭代了结果集。 总之,除非您选择迭代ResultSet,否则无法通过网络发送它包含的数据 我知道我必须迭代并向数据模型对象和列表添加内容的备选方案,但我急切地想知道这背后的理性是什么?java开发人员当时是怎么想的?据我所知,结果集并不“包含”数据。 如果调用Res

经过数小时的搜索,我终于意识到这是不可序列化的,也没有办法做到这一点。我尝试将其添加到列表中,作为可序列化对象中的实例变量和其他内容,但结果证明这是天真和绝望的尝试。我尝试使用类似的可序列化实现,但它们增加了响应时间,很可能是因为它们迭代了结果集。 总之,除非您选择迭代ResultSet,否则无法通过网络发送它包含的数据


我知道我必须迭代并向数据模型对象和列表添加内容的备选方案,但我急切地想知道这背后的理性是什么?java开发人员当时是怎么想的?

据我所知,结果集并不“包含”数据。 如果调用ResultSet,则将从数据库的底层(JDBC)连接获取数据


如果结果集被序列化并传输到另一台计算机,这是不可能的。在那里,连接将不可用。

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

首先,让我们注意到ResultSet是一个接口,设计者并不希望它是可序列化的

但是,ResultSet仍然是一个功能强大的接口,一般来说,它是可序列化的几乎没有意义。 举几个例子

  • ResultSet参与事务处理行为。如果要序列化结果集并将其发送到其他地方(到文件,通过RMI发送到另一个JVM…),那么原始事务会发生什么情况
  • ResultSet允许直接更新行中的列,甚至删除行。如果结果集要序列化并发送到其他地方,那么该如何工作
  • ResultSet允许对某些类型的列(*LOB)进行流式处理。流媒体在可序列化的环境中如何工作
  • 当(反)序列化时,此类刷新方法将如何工作
  • 这些是在考虑ResultSet序列化时出现的一些非常重要的问题

    在我看来,ResultSet的设计和优化是为了反映与关系数据库的直接和实时连接,而不是一组“可移植”数据

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

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

    因此,我认为ResultSet接口的设计者和大多数实现者更关心ResultSet的活动方面(参与事务处理行为和使用更新方法写回数据库的能力),而不是它的序列化(或可序列化性)。
    也就是说,如果在实现上有足够的限制条件(如不使用更新方法和禁用流式传输功能),当然可以实现可序列化的实现。

    正如您所说,“底线是,除非您选择迭代ResultSet,否则您无法通过网络发送它包含的数据。”如果
    ResultSet
    是可序列化的,您认为会有什么不同?或者您不必迭代
    ResultSet
    来序列化对象?谢谢,这很精确。完全回答了为什么部分?ResultSet可以包含成批的数据。这就是“fetchSize()'属性是为。真正的问题是它包含一个活动连接,该连接本质上是不可序列化的。@EJP,根据您的评论,它看起来像ResultSeimpl(驱动程序impl.)包含不可序列化的成员。请让我知道我的理解是否正确。同样,上面的答案似乎不正确,但仍然被接受。但是,在java上下文中,resultset和数组之间的实际区别是什么?您不能从resultset创建一个数组并将其序列化吗?!一个
    数组
    是一种保存数据的数据结构,而
    ResultSet
    包含一个实时连接,在调用时将获取数据。ResultSet还可能包含一批具有急切加载策略的数据,但这取决于驱动程序的实现。