发布者:[本站编辑] 来源:[] 浏览:[] 评论:[] 字体:大 中 小
面对互用性的挑战
在最基本的层次上,实现应用程序平台之间的互用性要涉及到数据的交换。 当实现一个 .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 数据的方法。 .NET 和 J2EE 都具有包含分析功能的 XML 序列化程序。
当创建 XML 文档时,XML 序列化提供显著的改进。 它使您脱离沉闷的 XML 分析过程,关注开发应用程序本身和相关数据类型。 XML 序列化将 .NET 中的对象收集任务简化,将其转换为 XML 文档并且可以让一个 Java 应用程序去读取,反之亦然。
在 .NET 平台上实现 XML 序列化
.NET 框架为 XML 序列化提供大量的类和 API。 其中一个主要的类就是 System.Xml.Serialization.XmlSerializer 类。 该类将 .NET 框架类型序列化为 XML文档,并且可将 XML 文档序列化回来。 XML 序列化只将一个对象的公共字段和属性转换(或序列化)为一个 XML 流,但是二进制序列化将对象的公共和私有字段连同类名以及包括该类的程序集转换为字节流。
可以使用 [Serializable] 属性指明要序列化的类型,如同二进制序列化一样。 还可以使用该数据类型类实现 ISerializable 接口。
XML 序列化使用与二进制序列化不同的规则。 例如,不必使用 [Serializable] 属性标明 .NET 数据类型,尽管这仍是建议的做法。 然而,.NET 数据类型必须有一个有效的默认公共构造函数。
将 .NET 对象序列化为 XML
以下示例说明在 .NET 下如何使用 XMLSerializer 将一个 CustomerData 类的实例(称为 custData)转换为一个 XML 流。 该示例假设 .NET 框架应用程序已经具有一个被定义为 CustomerData 的标记为可序列化的数据类型类。
XmlSerializer serializer = new XmlSerializer(typeof(CustomerData))
serializer.Serialize(fileStream, custData)
XMLSerializer 类的 Serialize 方法序列化CustomerData 对象的内容 custData,并且产生一个文件流输出。 该流指向一个文件,该文件是一个 XML 文档,它代表 CustomerData 对象的序列化版本 custData。
将 XML 中的对象反序列化到 .NET 中去
下一个示例说明如何使用 .NET 中的 XMLSerializer 从一个存储为文件的 XML 文档返回 CustomerData 对象的实例 custData。
XmlSerializer serializer = new XmlSerializer(typeof(CustomerData))
CustomerData custData =
(CustomerData)serializer.Deserialize(fileStream)
此处使用类 XmlSerializer 的方法 Deserialize 从一个作为流传递到序列化程序中的 XML 文档返回一个 CustomerData 对象 custData。
注Deserialize 方法返回一个具有 System.Object 类型的对象。 在将返回对象分配给目标类型前确保对返回的对象进行了适当的强制转换。
序列化可能因为某些原因而失败:
• 反序列化的 XML 文档包括序列化程序无法处理的字段。
• 对象无法序列化,如实现 IDictionary 接口的任何对象。
• 对象未被声明为公共。
• 对象不包括一个有效的无参数构造函数。
注在试图序列化一个满足上面讲的四种类别之一的对象时,从 XmlSerializer.中生成一个 System.InvalidOperationException。 当调试 XML 序列化时,应该检查并且处理任何满足这种异常的实例。
为 Java 平台实现 XML 序列化
无论对 J2SE 还是 J2EE 而言,对象的 XML 序列化都不是核心规范的一部分。 因此,需要使用一个第三方序列化程序,几个选择如下:
• Electric XML
• Apache Cocoon
• Open XML Framework (OXF)
• Java Architecture for XML Binding (JAXB)
尽管无需使用 Web 服务来使用 XML 序列化特性,许多序列化程序仍旧构成了较大的 Web 服务软件包的一部分。 Java 序列化程序结合使用反射 和映射 将对象数据写为正确的 XML 格式。 反射是一种检查对象结构的技术,而映射类似于一个可扩展样式表语言转换 (XSLT) 文档,将对象中的字段名映射为 XML 文档的元素或属性。
使一个 Java 类可序列化,需要实现 Serializable 接口。 因此 CustomerData 的类声明如下。
public class CustomerData implements java.io.Serializable
可序列化的类也必须具有一个无参数构造函数。 还可以使用 serialPersistentFields 成员去显式声明哪些字段可被序列化,或者使用瞬态关键字指出无法序列化的字段。 不可序列化字段的示例可能是包含敏感数据的字段。
为了控制保存和读信息,在 Java 中标记为序列化的类还可实现 readObject 和 writeObject 方法,以及 writeReplace 和 readResove 方法以指定替换对象。
为对类的序列化进行完全控制,还可实现 Externalizable 而不是 Serializable。 当使用 Externalizable 时,必须实现 writeExternal 和 readExternal 方法写数据内容以及数据格式和相关的元数据。
接下来两个使用 Electric XML 的示例说明如何序列化和反序列化一个 Java 对象。 此处您可以看到 Electric XML 对 .NET 使用相似的方式处理序列化和反序列化过程。
将 Java 对象序列化为 XML
下面的示例假设 Java 应用程序定义一个可序列化的数据类型类 OrderData,该数据类型类实现了 java.io.serializable。 它说明了在 J2EE 中如何使用 Electric XML 序列化程序将该类的命名实例 order 转换为一个 XML 文档。
electric.xml.io.IWriter writer = new LiteralWriter(xmlNameSpace,OrderData)
writer.writeObject(order)
electric.xml.Document document = writer.getDocument()
在该示例中,首先创建了类型 electric.xml.io.IWriter 的一个实例,将要创建的 XML 文档的 XML 命名空间和对象类型 (OrderData) 作为参数传入。 IWriter 对象的 writeObject 方法序列化 OrderData 对象的内容 order。 最后,对象 IWriter 的方法 getDocument 返回包含对象 OrderData 的已序列化内容的 XML 文档。 随后可以将该文档写入到流。
从 XML 反序列化对象到 Java
下一个示例说明在 J2EE 中如何使用 Electric XML 序列化程序从名为 xmlDocument 的 XML 文档中返回 OrderData 对象的一个实例 order。
electric.xml.io.IReader reader = new LiteralReader(xmlDocument)OrderData order = (OrderData)reader.readObject(OrderData.class)
这里使用 IReader 类的 readObject 方法从作为参数传到读取器的 XML 文档中返回 OrderData 对象的一个实例 order。
注readObject 方法返回类型 java.lang.Object 的一般对象。 在给目标类型分配返回对象之前,必须对此返回对象进行适当的强制转换。
有关 Java 平台上的 XML 序列化的其他示例,请参阅第 7 章 “在表示层集成 .NET”。
使用 XML 架构确保类型兼容性
您现在已经了解了在一个平台上如何使用 XML 序列化将一个对象序列化为一个 XML 格式,然后在另一个环境中将其反序列化为原来的对象类型。 然而,仅 XML 序列化还不能解决 .NET 和 Java 间交换数据的问题。
当使用序列化技术时主要考虑的问题是确保在从一个平台产生一个 XML 文档时,这个文档与另一个平台兼容。 不应想当然地认为一定兼容。 XML 架构 提供了为 XML 文档指定格式的互用性协定。 正是该组件为成功进行 .NET 和 Java 互联提供了模板。
XML 文档本身没有在这个文档内定义数据类型。 因此值 4.56 可能是 string、double 或者 float。 这使接收平台很难正确导入该值。 类似地,这两个平台都可以实现类型 OrderData,而 .NET 版本的类型与 Java 中的同名类型完全没有关系。
例如,如果在 .NET 平台上将 OrderData 对象序列化为一个 XML 文档,并且将其传入要使用的 Java 应用程序中,需要回答以下问题:
• Java 应用程序怎样知道如何对 OrderData 对象进行反序列化?
• 在 Java 中有一个数据类型 OrderData 等同于 .NET 中的数据类型 OrderData 吗?
• Java 中的数据类型 OrderData 与 .NET 中的数据类型 OrderData 若不存在相同点又会怎样?
这些问题都指向为使 .NET 与 Java 间可以交换数据而需要解决的数据类型兼容性问题。
理解 XML 架构文档
XML 架构通过定义 XML 文档格式,凭借帮助在 .NET 和 J2EE 间交换数据的 XML 架构文档 (XSD) 提供了一个连接框架。 一个 XSD 文件指定一个 XML 架构,并且 XSD 文件本身就是另一个具有固定结构的 XML 文档。 XSD 内的节点和元素定义相关的 XML 文档中的元素和数据类型。. XSD 也包含 XML 文档中的每个元素的任何约束。
在 XSD 文件内,您可以指定以 XML 格式存储的数据类型的定义。 例如,当在 XSD 中定义数据类型 OrderData 时,可以指定这个对象中字段的名称和个数,如 orderID、itemDescription 和 price。 也可以指定对象 OrderData 中的 price 字段的值 (4.56) 的类型是 double。
XSD 使您可以定义 XML 命名空间。 XML 命名空间允许声明唯一类型并且也允许标识可能有相同名称的不同数据类型。
XSD 中的一个必需组件是公共命名空间。 这使您可以声明元素(如 xs:complexType)在文档中是唯一的。 有关 XSD 命名空间的更多信息,请参阅 the W3Consortium Web site。
Visual Studio .NET 包括一个 XML 设计器工具,使您可容易地设计 XML 架构。 XML 设计器使您可在架构的图形表示和表示 XML 架构的 XSD 文档间切换模式。 XML 设计器创建了独立于平台的 XSD,它符合 W3C 标准。. 有关 Visual Studio.NET 生成架构的更多信息,请参阅 Visual Studio .NET 帮助。
IBM Websphere Studio Application Developer 5.0 也包括一个使您可轻松地设计 XML 架构的工具。 XSD 设计器使您能够在正在设计的架构的图形表示和表示 XML 架构的实际 XSD 文档间切换模式。 在 IBM WebSphere Studio Application Designer 中设计的 XSD 也是与平台无关的,并且符合 W3C 组织的 XSD 标准。
使用 XSD 确保类的兼容性
前一节讲述了如何在一个 XSD 中实现一个 XML 架构以定义一个 XML 文档的格式。 您可以使用该知识解决最后的数据交换的难题。
事实是 .NET 和 Java 平台在数据类型上达成一致的可能性很小。 然而,利用 XSD 这两个平台可以 在 XML 文档格式上统一。 如果说互用性如同国际外交,XSD 将是走向世界和平的一个主要的里程碑。
.NET 和 Java 都具有允许将一个类映射为已经定义的 XML 架构的工具,反之亦然。 当映射一个类到一个 XML 架构时,通过序列化该类的实例而生成的 XML 文档与 XSD 定义的 XML 格式相匹配。 通过将每个平台的类映射为公共 XML 架构,可以确保这些平台间能够交换 XML 数据。
例如,在 .NET 和 Java 平台上将类 CustomerData 映射为一个公共 XML 架构文件 CustomerData.xsd。 然后,将能够将 Java 类 CustomerData 的实例序列化为一个 XML 文档,然后将它反序列化为一个 .NET 类 CustomerData 的实例。
使用 Java 和 .NET 中的 XML 架构映射工具,主要有两种设计交换数据的公共格式的方法:
• 从一个公共的 XML 架构开始,然后在两个平台上产生数据类型类。 该方法确保建立与平台无关的数据类型和架构。
• 从一个现有的数据类型类(从任意的平台)开始,由它生成一个 XML 架构,然后根据生成的 XML 架构产生另一个平台的相应数据类型类。
注如果该类在两个平台上都不存在,第一个技术是最好的。 如果它们在一个或另一个平台上确实存在,则必须使用第二种方法。
对两个方法中的任意一个,技术不同点在于工作在 Java 还是 .NET 平台。
在 .NET 中映射 XSD 和类
.NET 框架提供一个 XML 架构定义工具 Xsd.exe,可以用来映射 .NET 类到 XML 架构并且再将其映射回来。 使用该工具,您可以:
• 从一个 XSD 生成一个 .NET 类。
• 从一个 .NET 类生成一个 XSD。
例如,如果为一个名为 ProductsData 的数据类型定义一个 XML 架构文档 ProductsData.xsd,可以使用 Xsd.exe 产生一个名为 ProductsData 的可序列化的 .NET 类。 序列化一个 .NET ProductData 类实例产生与一个定义在 XML 架构文档内的 XML 格式相匹配的 XML 文档。
如果在 .NET 中定义一个可序列化的类 ProductsData,还可以使用 Xsd.exe 生成一个 XML 架构 ProductsData.xsd,它定义了包含 ProductsData 对象的一个可序列化版本的 XML 文档的格式。
注Xsd.exe 仅允许您遵循 WWW 联盟的 XML 架构定义语言的实施标准对 XML 架构进行操作。
有关 XML 架构定义工具的更多信息,请参阅 MSDN 上的 XML Schema Definition Tool。
有关如何使用 XML 架构定义工具的其他示例,请参阅 Simon Guest 撰写的 Microsoft .NET and J2EE Interoperability Toolkit 一书的第 3 章。
在 Java 中映射 XSD 和类
在 Java 平台上,可使用多个工具将 Java 类映射为 XML 架构,反之亦然。示例如下:
• Electric XML 的 schema2java 和 java2schema
• Java Architecture for XML Binding (JAXB)
注大多数 XML 序列化工具的供应商提供相当于 schema2java 和 java2schema 的实用工具。 然而,本书中的示例使用 Electric XML 版本。
schema2java 和 java2schema 工具提供的功能与 .NET 上的 Xsd.exe 非常相似。 使用 Electric XML 工具可以:
• 使用 schema2java 生成一个来自 XSD 的 Java 类。
• 使用 java2schema 生成来自 Java 类的 XSD。
可以使用带有同一 XML 架构文件 ProductsData.xsd 的 schema2java 工具(ProductsData.xsd 是在 .NET 示例中为名为 ProductsData 的数据类型定义的)生成一个名为 ProductsData 的可序列化 Java 类。
java2schema 工具允许执行相反的过程。 如果在 Java 中定义一个名为 ProductsData 的可序列化类,可以使用 java2schema 生成一个 XML 架构 ProductsData.xsd。该文档 定义包括 Java ProductsData 对象的序列化版本的 XML 文档格式。
注只能从已编译的类产生 XSD,而不是从源代码产生。
有关 schema2java 和 java2schema 的更多信息,请参阅本章结束部分的参考部分中包含的 electric.xml io tool 软件包。
有关如何使用 Electric XML 工具映射 Java 类和 XML 架构的示例,请参阅 Microsoft .NET and J2EE Interoperability Toolkit 的第 3 章 70 至 80 页。
在前面章节的 .NET 和 Java 示例中,因为 Java 类 ProductsData 和 .NET 类 ProductsData 都来源于 ProductsData.xsd,所以两个类都被序列化为同一 XML 格式。 因此可以将某个平台的 ProductsData 类实例序列化为一个 XML 文档,然后将其反序列化为另一个平台的 ProductsData 类的一个实例。
使用 XSD 生成类型是非常有效的,它对提供跨平台的互用性大有帮助。 XSD 也是 WSDL 中的一个基础元素。 当在 XML Web 服务中查看数据类型转换时,理解 XSD 结构非常有益。
映射 XSD 类型
前面的部分描述了如何在 .NET 和 Java 中映射类和 XSD。 但是,当使用该技术创建交换数据的一个公共格式时,具有一些限制性。 在大多数情况下,您使用的在 .NET 和 Java 中存储数据的复杂数据类型由原始类型组成。 不幸的是,不是所有的原始类型在 .NET 和 Java 之间都有一个直接的映射。
XSD 公共命名空间定义了
数据互操作性就是指异构数据源之间的转换。数据库互操作性技术就是解决异构数据源之间相互转换的技术。该技术可以提高数据库管理系统的适应性,是数据库管理系统的一个核心技术和组件。详细资料:http://www.yhrtvu.com/yhddweb_v4/xxydyc/KCXX/GGK/sql/fxty.doc