熱點推薦:
您现在的位置: 電腦知識網 >> 操作系統 >> Windows優化 >> 正文

應用程序互操作性:互用性基本原理

2013-11-12 00:07:22  來源: Windows優化 

  面對互用性的挑戰
  在最基本的層次上實現應用程序平台之間的互用性要涉及到數據的交換 當實現一個 NET 和 JEE 互用性項目時面臨三種主要的數據交換挑戰 這三個挑戰如下
  
  &#; 原始數據類型映射
  
  &#; 不存在的數據類型
  
  &#; 復雜數據類型
  
  注原始數據類型是基於 NET 或 Java 的基本類型系統的組件例如整型字符串雙精度等
  
  所有的挑戰都涉及到類型兼容性並有可能阻礙或阻止數據傳輸
  
  這三個挑戰分解如下
  
  &#; 原始數據類型映射 鈥_ 您可能知道String類型在 CLR 和 Java 中都存在 然而這並不意味著 Java 中的 javalangString 完全映射為 NET 中的 SystemString 如果示例公開 javalangString您如何將之映射為 CLR 中的相當成分?
  
  &#; 不存在的數據類型 鈥_ 如何映射一個平台上有而另一個平台上沒有的數據類型? 例如SystemCollectionsSpecializedHybridDictionary 是一個在 CLR 中被證實存在的數據類型但在 Java 中卻沒有相似的數據類型 Java 中存在類似情況例如 JavautilVector它在 NET 中沒有相似的數據類型
  
  &#; 復雜數據類型鈥_ 您的應用程序可能公開復雜數據類型由數量眾多的原始數據類型或者嵌套的原始數據類型組成 此時需要公開復雜數據類型以便其他平台可以使用它
  
  考慮如圖 所示的集成一個 ASPNET 表示層和一個 JEE 業務層的示例 在此示例中JEE 業務層中的一個 EJB 公開了一個 ASPNET 表示層隨後調用的方法 在一個生產應用程序中該返回數據不可能是簡單的Hello World字符串它可能包含復雜元素
  
 

  
ASPNET 表示層連接到 JEE 業務層

  幸運的是已經存在許多方法可使應用程序在不同平台之間交換不同類型的數據並且第 章和第 章將詳細地描述這些選擇 然而在能夠在兩個平台間建立連接之前您必須在它們試圖進行交換之前確保雙方理解特定的數據類型除此之外也有一個使雙方都可以使用的傳遞數據的方法 下一部分講述如何使用序列化實現該傳遞
  
  使用序列化
  序列化是使一個對象或類編碼成為永久的或可傳輸狀態的過程 這使您接受一個復雜數據類型然後編碼保存傳遞和解碼並可能使用一個單獨的進程處理解碼
  
  有兩個主要的序列化類型
  
  &#; 二進制序列化 鈥_ 接受數據類型並且將其轉換為二進制流
  
  &#; XML 序列化 鈥_ 將數據類型轉換為可以隨後轉換為 XML 文檔的 XML 流
  
  可以從任一種序列化類型中接受輸出並將其存儲在內存中放在文件中還可以通過網絡連接進行傳輸 例如您的應用程序可能有一個已經定義的復雜數據類型 CustomerData它存儲著有關客戶的信息(如姓名地址電話號碼等) 可以使用序列化將 CustomerData 數據類型轉換為一個二進制或 XML 流這樣您可以跨越進程邊界進行傳輸或者將它保存為一個文件稍候使用 當該對象存在於二進制或 XML 格式中時就已經被序列化了
  
  反序列化是一個將已經序列化的對象轉換回它原始形式的過程 通常將對象反序列化為它們的原始類型 因此如果將 CustomerData 數據類型序列化為一個二進制流或一個 XML 文檔能夠將其反序列化回數據類型 CustomerData 而不能反序列化為數據類型 OrderDataOrderData
  
  NET和 JEE 在同一平台內應用程序間的數據交換都使用序列化 通過將序列化對象傳遞給其他平台以進行反序列化還可以使用序列化在不同平台上的應用程序間交換數據 以下部分考查如何在 NET 和 Java 上實現二進制和 XML 序列化
  
  理解二進制序列化
  二進制序列化是接受一種復雜數據類型(或對象)並將其編碼為一個二進制流更改為永久狀態傳輸然後解碼(反序列化)回原始復雜數據類型的過程
  
  Java 和 NET 兩者都包含一個能將任何可序列化的數據類型轉換為一個字節流的二進制序列化程序 各個平台上執行該序列化的類是相似的並且實現起來很簡單
  
  對 NET 和 Java 兩者的二進制序列化而言首先必須使用一個標簽以指示要序列化一個類型NET 中可以使用 [Serializable] 屬性或實現 ISerializable 接口 在 Java 中同樣的方法是使用類實現 javaioserializable
  
  不幸的是NET 和 Java 的序列化程序不兼容 因此無法將由 Java 序列化程序序列化的 CustomerData 對象直接流式傳輸到 NET 版本中去反之亦然 即使可以這樣做還是要面對如下挑戰NET 框架應用程序理解 Java 序列化程序產生的 CustomerData 對象 NET 一方可能沒有一個等同的 CustomerData 數據類型來接受來自 Java 方的 CustomerData 反序列化對象
  
  只要使用同樣的格式化程序執行對象的序列化和反序列化就可以 使用二進制序列化程序連接 NET 到 Java 創建來自數據類型的字節流格式必須與接收字節流並且重新構造對象的格式完全匹配
  
  有兩種可以用來避免默認的 JEE 和 NET 二進制序列化程序不兼容的方法 它們是:
  
  &#; 創建一個在 Java 和 NET 中共享相同格式選項的自定義序列化程序
  
  &#; 在 NET 框架中使用一個處理二進制格式化程序的第三方產品如 JaNET 或 JNBridgePro
  
  有關使用 JaNET 和 JNBridgePro 實現二進制序列化的更多信息請參閱第 互用性技術 點對點
  
  理解 XML 序列化
  XML 序列化是接受一個復雜數據類型(或對象)並將其解碼為 XML 流的過程 然後可以將 XML 流轉變為一個 XML 文檔形式的持久化狀態進行傳輸再將其解碼(反序列化)回其原始復雜數據類型(或對象)
  
  為了理解 XML 序列化過程必須對 XML 有一個基本的了解 XML 是一個基於文本的包含結構化的和可擴展數據的文檔標記語言 因為 XML 是基於文本的所以可以像一個正常的文本一樣讀它並且因為它是可擴展的所以可以使用它描述幾乎所有的信息類型 因此 XML 文檔可以包括
  
  &#; 文本
  
  &#; 圖片
  
  &#; 程序設置
  
  &#; 數據架構
  
  &#; 批注
  
  &#; 插入
  
  XML 文檔也可以包括關於如何使用文檔自身中的數據的指導
  
  有關 XML 的更多信息請參閱 Microsoft XML Web site
  
  在理解二進制序列化一節中您可以看到 NET 和 Java 平台的二進制序列化程序是如何互相不兼容的 然而XML 是與平台無關的 如果在一個平台中可以將一個對象或數據類型序列化為 XML 文檔應該很容易讀取理解和反序列化該文檔為另一個平台的對象或數據類型 不幸的是並非總是如此但在大多數情況下 XML 序列化的確提供了一個互用性通道
  
  分析 XML 文檔
  在 NET 和 JEE 內有幾種不同的方法可以讀寫和編輯 XML 文檔 該過程就是 XML 分析並且兩個平台都具有穩定成熟的 XML 分析器 使用分析器您可以在人工地從一個 XML 文檔中讀取數據的應用程序內編寫代碼然後將數據插入到一個復雜數據類型對象 例如可以使用分析從 JEE 應用程序產生的 XML 文檔中讀取數據然後將數據插入到 NET 數據類型 分析允許在 NET 和 JEE 之間交換數據
  
  讀寫 XML 文檔的分析器通常主要分三種類型
  
  &#; 雙方平台上的文檔對象模型 (DOM)
  
  &#; 僅在 Java 上的用於 XML 的簡單 API (SAX)
  
  &#; 僅在 NET 上的 Pull model 分析
  
  DOM XML 分析器將整個文檔加載到內存這具有一些優點也有一些缺點 整個文檔位於內存中可以簡單快速地遍歷 XML 層但大量的文檔會因為內存的消耗而影響性能和響應
  
  SAX 只根據需要讀取 XML 文件的一部分 由於是按需要讀文件則對性能的影響較小但由於阻止向後分析而降低了靈活性
  
  Pull model 分析使用一個只進只讀的 XmlReader 游標XMLReader 提供快速無緩存的流去訪問輸入數據允許提取數據和忽略不感興趣的記錄 因為 XmlReader 處於 pull model必要時應用程序可從讀取器中提取節點 Pull model 提供了一些便利如狀態管理多輸入流避免額外的字符串復制以及有選擇性地處理 有關使用 XmlReader 的更多信息請參閱 MSDN 上的Reading XML with the XmlReader
  
  SystemXml 命名空間提供 XmlDocument 和 XmlElement 兩個類使您能夠在 NET 中分析 XML 還提供一些方法能夠在 XML 文檔內添加和修改元素並且遍歷那些文檔
  
  在 Java 中可以使用 Document 和 Element 類達成相似的結果
  
  XML 分析的局限性
  您需要了解一些 XML 分析的局限性 當從一個 XML 文檔訪問和讀取不同的數據元素時分析工作進行正常 然而對文檔本身操作信息可能很快就會變得很困難 而且分析器沒有內部方法可用於將 XML 文檔中的對象映射為 Java 或 NET 中的類 將 XML 文檔中的數據映射為應用程序的對象和類中需要將 XML 序列化
  
  XML 分析被認為是一種實現 XML 序列化的低效方法並且不建議使用此方法作為在 NET 和 Java 間交換 XML 數據的方法
From:http://tw.wingwit.com/Article/os/youhua/201311/10709.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.