面對互用性的挑戰 在最基本的層次上
實現應用程序平台之間的互用性要涉及到數據的交換
當實現一個
NET 和 J
EE 互用性項目時
面臨三種主要的數據交換挑戰
這三個挑戰如下
; 原始數據類型映射
; 不存在的數據類型
; 復雜數據類型
注原始數據類型是基於
NET 或 Java 的基本類型系統的組件
例如
整型
字符串
雙精度等
所有的挑戰都涉及到類型兼容性
並有可能阻礙或阻止數據傳輸
這三個挑戰分解如下
; 原始數據類型映射 鈥_ 您可能知道
String
類型在 CLR 和 Java 中都存在
然而
這並不意味著 Java 中的 java
lang
String 完全映射為
NET 中的 System
String
如果示例公開 java
lang
String
您如何將之映射為 CLR 中的相當成分?
; 不存在的數據類型 鈥_ 如何映射一個平台上有而另一個平台上沒有的數據類型? 例如
System
Collections
Specialized
HybridDictionary 是一個在 CLR 中被證實存在的數據類型
但在 Java 中卻沒有相似的數據類型
Java 中存在類似情況
例如 Java
util
Vector
它在
NET 中沒有相似的數據類型
; 復雜數據類型鈥_ 您的應用程序可能公開復雜數據類型
由數量眾多的原始數據類型或者嵌套的原始數據類型組成
此時需要公開復雜數據類型以便其他平台可以使用它
考慮如圖
所示的集成一個 ASP
NET 表示層和一個 J
EE 業務層的示例
在此示例中
J
EE 業務層中的一個 EJB 公開了一個 ASP
NET 表示層隨後調用的方法
在一個生產應用程序中
該返回數據不可能是簡單的
Hello World
字符串
它可能包含復雜元素
圖 ASPNET 表示層連接到 JEE 業務層 幸運的是
已經存在許多方法可使應用程序在不同平台之間交換不同類型的數據
並且第
章和第
章將詳細地描述這些選擇
然而
在能夠在兩個平台間建立連接之前
您必須在它們試圖進行交換之前確保雙方理解特定的數據類型
除此之外也有一個使雙方都可以使用的傳遞數據的方法
下一部分講述如何使用序列化實現該傳遞
使用序列化 序列化是使一個對象或類編碼成為永久的或可傳輸狀態的過程
這使您接受一個復雜數據類型
然後編碼
保存
傳遞和解碼
並可能使用一個單獨的進程處理解碼
有兩個主要的序列化類型
; 二進制序列化 鈥_ 接受數據類型並且將其轉換為二進制流
; XML 序列化 鈥_ 將數據類型轉換為可以隨後轉換為 XML 文檔的 XML 流
可以從任一種序列化類型中接受輸出
並將其存儲在內存中
放在文件中
還可以通過網絡連接進行傳輸
例如
您的應用程序可能有一個已經定義的復雜數據類型 CustomerData
它存儲著有關客戶的信息(如姓名
地址
電話號碼等)
可以使用序列化將 CustomerData 數據類型轉換為一個二進制或 XML 流
這樣您可以跨越進程邊界進行傳輸或者將它保存為一個文件稍候使用
當該對象存在於二進制或 XML 格式中時
就已經被序列化了
反序列化是一個將已經序列化的對象轉換回它原始形式的過程
通常
將對象反序列化為它們的原始類型
因此
如果將 CustomerData 數據類型序列化為一個二進制流或一個 XML 文檔
能夠將其反序列化回數據類型 CustomerData 而不能反序列化為數據類型 OrderData
OrderData
NET和 J
EE 在同一平台內應用程序間的數據交換都使用序列化
通過將序列化對象傳遞給其他平台以進行反序列化
還可以使用序列化在不同平台上的應用程序間交換數據
以下部分考查如何在
NET 和 Java 上實現二進制和 XML 序列化
理解二進制序列化 二進制序列化是接受一種復雜數據類型(或對象)
並將其編碼為一個二進制流
更改為永久狀態
傳輸然後解碼(反序列化)回原始復雜數據類型的過程
Java 和
NET 兩者都包含一個能將任何可序列化的數據類型轉換為一個字節流的二進制序列化程序
各個平台上執行該序列化的類是相似的
並且實現起來很簡單
對
NET 和 Java 兩者的二進制序列化而言
首先必須使用一個標簽以指示要序列化一個類型
在
NET 中
可以使用 [Serializable] 屬性或實現 ISerializable 接口
在 Java 中
同樣的方法是使用類實現 java
io
serializable
不幸的是
NET 和 Java 的序列化程序不兼容
因此
無法將由 Java 序列化程序序列化的 CustomerData 對象直接流式傳輸到
NET 版本中去
反之亦然
即使可以這樣做
還是要面對如下挑戰
讓
NET 框架應用程序理解 Java 序列化程序產生的 CustomerData 對象
NET 一方可能沒有一個等同的 CustomerData 數據類型來接受來自 Java 方的 CustomerData 反序列化對象
只要使用同樣的格式化程序執行對象的序列化和反序列化
就可以 使用二進制序列化程序連接
NET 到 Java
創建來自數據類型的字節流格式
必須與接收字節流並且重新構造對象的格式完全匹配
有兩種可以用來避免默認的 J
EE 和
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 和 J
EE 內
有幾種不同的方法可以讀
寫和編輯 XML 文檔
該過程就是 XML 分析
並且兩個平台都具有穩定成熟的 XML 分析器
使用分析器
您可以在人工地從一個 XML 文檔中讀取數據的應用程序內編寫代碼
然後將數據插入到一個復雜數據類型對象
例如
可以使用分析從 J
EE 應用程序產生的 XML 文檔中讀取數據
然後將數據插入到
NET 數據類型
分析允許在
NET 和 J
EE 之間交換數據
讀寫 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
System
Xml 命名空間提供 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