簡體   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