分享
 
 
 

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

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

面对互用性的挑战

在最基本的层次上,实现应用程序平台之间的互用性要涉及到数据的交换。 当实现一个 .NET 和 J2EE 互用性项目时,面临三种主要的数据交换挑战。 这三个挑战如下:

• 原始数据类型映射。

• 不存在的数据类型

• 复杂数据类型

注原始数据类型是基于 .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 中没有相似的数据类型。

• 复杂数据类型?_ 您的应用程序可能公开复杂数据类型,由数量众多的原始数据类型或者嵌套的原始数据类型组成。 此时需要公开复杂数据类型以便其他平台可以使用它。

考虑如图 3.1 所示的集成一个 ASP.NET 表示层和一个 J2EE 业务层的示例。 在此示例中,J2EE 业务层中的一个 EJB 公开了一个 ASP.NET 表示层随后调用的方法。 在一个生产应用程序中,该返回数据不可能是简单的“Hello World”字符串,它可能包含复杂元素。

图 3.1: ASP.NET 表示层连接到 J2EE 业务层

幸运的是,已经存在许多方法可使应用程序在不同平台之间交换不同类型的数据,并且第 4 章和第 5 章将详细地描述这些选择。 然而,在能够在两个平台间建立连接之前,您必须在它们试图进行交换之前确保双方理解特定的数据类型,除此之外也有一个使双方都可以使用的传递数据的方法。 下一部分讲述如何使用序列化实现该传递。

使用序列化

序列化是使一个对象或类编码成为永久的或可传输状态的过程。 这使您接受一个复杂数据类型,然后编码、保存、传递和解码,并可能使用一个单独的进程处理解码。

有两个主要的序列化类型:

• 二进制序列化 ?_ 接受数据类型并且将其转换为二进制流。

• XML 序列化 ?_ 将数据类型转换为可以随后转换为 XML 文档的 XML 流。

可以从任一种序列化类型中接受输出,并将其存储在内存中、放在文件中,还可以通过网络连接进行传输。 例如,您的应用程序可能有一个已经定义的复杂数据类型 CustomerData,它存储着有关客户的信息(如姓名、地址、电话号码等)。 可以使用序列化将 CustomerData 数据类型转换为一个二进制或 XML 流,这样您可以跨越进程边界进行传输或者将它保存为一个文件稍候使用。 当该对象存在于二进制或 XML 格式中时,就已经被序列化了。

反序列化是一个将已经序列化的对象转换回它原始形式的过程。 通常,将对象反序列化为它们的原始类型。 因此,如果将 CustomerData 数据类型序列化为一个二进制流或一个 XML 文档,能够将其反序列化回数据类型 CustomerData 而不能反序列化为数据类型 OrderData。OrderData.

.NET和 J2EE 在同一平台内应用程序间的数据交换都使用序列化。 通过将序列化对象传递给其他平台以进行反序列化,还可以使用序列化在不同平台上的应用程序间交换数据。 以下部分考查如何在 .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。 创建来自数据类型的字节流格式,必须与接收字节流并且重新构造对象的格式完全匹配。

有两种可以用来避免默认的 J2EE 和 .NET 二进制序列化程序不兼容的方法。 它们是:

• 创建一个在 Java 和 .NET 中共享相同格式选项的自定义序列化程序。

• 在 .NET 框架中使用一个处理二进制格式化程序的第三方产品,如 JaNET 或 JNBridgePro。

有关使用 JaNET 和 JNBridgePro 实现二进制序列化的更多信息,请参阅第 4 章“互用性技术: 点对点。”

理解 XML 序列化

XML 序列化是接受一个复杂数据类型(或对象)并将其解码为 XML 流的过程。 然后,可以将 XML 流转变为一个 XML 文档形式的持久化状态,进行传输,再将其解码(反序列化)回其原始复杂数据类型(或对象)。

为了理解 XML 序列化过程,必须对 XML 有一个基本的了解。 XML 是一个基于文本的包含结构化的和可扩展数据的文档标记语言。 因为 XML 是基于文本的,所以可以像一个正常的文本一样读它;并且因为它是可扩展的,所以可以使用它描述几乎所有的信息类型。 因此 XML 文档可以包括:

• 文本

• 图片

• 程序设置

• 数据架构

• 批注

• 插入

XML 文档也可以包括关于如何使用文档自身中的数据的指导。

有关 XML 的更多信息,请参阅 Microsoft XML Web site。

在“理解二进制序列化”一节中,您可以看到 .NET 和 Java 平台的二进制序列化程序是如何互相不兼容的。 然而,XML 是与平台无关的。. 如果在一个平台中可以将一个对象或数据类型序列化为 XML 文档,应该很容易读取、理解和反序列化该文档为另一个平台的对象或数据类型。 不幸的是,并非总是如此,但在大多数情况下 XML 序列化的确提供了一个互用性通道。

分析 XML 文档

在 .NET 和 J2EE 内,有几种不同的方法可以读、写和编辑 XML 文档。 该过程就是 XML 分析,并且两个平台都具有稳定成熟的 XML 分析器。 使用分析器,您可以在人工地从一个 XML 文档中读取数据的应用程序内编写代码,然后将数据插入到一个复杂数据类型对象。 例如,可以使用分析从 J2EE 应用程序产生的 XML 文档中读取数据,然后将数据插入到 .NET 数据类型。 分析允许在 .NET 和 J2EE 之间交换数据。

读写 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 数据的方法

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有