动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.通过内部类的一个例子展示java中.
.Java线程入门——什么是线程.
.JAVA30个基本知识.
.Java认证经典模拟题.
.Sun发布补丁 修复JRE七个高.
.文件下载程序中文件名过长的问题.
.TOMCAT与Resin之我的见解.
.分享关于Java 语言中的函数编程.
.玩转Java的CLASSPATH.
.为什么Java中继承是有害的一.
.Java 在Client/Server 中应用.
.Sun将升级高端Unix服务器 UltraS.
.探索J2ME:用GCF通信.
.从数据库中读取并生成图片的Serv.
.Jive笔记--Database Package下面.
.Math 对象.
.jdbc应用--数据库连接全集.
.基于jCOM搭建Java-微软信息桥梁.
.JBuilder光标问题的解决方案.
.java设计模式之 Adapter(纠合不兼.

Axis序列化/反序列化器开发指南

发表日期:2008-1-5 |



  前言
  
  Axis是Apache组织推出的SOAP引擎,Axis项目是Apache组织闻名的SOAP项目的后继项目。Axis为开发者提供了大量的序列化/反序列化器,能够基本满足大部分应用。但在某些情况下,对特定的对象,现有的序列化/反序列化器不能胜任,于是只有开发人员自己实现专用于此对象的序列化/反序列化器插入到Axis中来完成序列化工作。考虑到Web Service是一门新兴技术,中文资料大多是泛泛的讲解,关于序列化/反序列化器的开发鲜有较为深入的介绍,本文提供一份较为完整的开发指南,并提供了一个十分有用的实现,即序列化JDOM模型的Element,使其可以通过Web 服务在网络上传输,我想这一扩展是许多采用JDOM作为XML解析工具的开发人员都梦寐以求的功能。通过本文的介绍和实例,希望能起到抛砖引玉的作用,读者在阅读完本文之后可以轻松的实现针对于任何非符合BEAN规范的对象的序列化/反序列化器。
  
  本文所面对的读者需要有一定的使用Axis做Web服务开发的开发经验,因此关于如何Axis的基础知识并不在本文的介绍范围,假如读者对此感爱好,可以参考本文最后的参考资料部分,去相应的网站进行学习。
  
  序列化/反序列化器简介
  
  序列化/反序列化器在英文中的对应翻译是Serializer/Deserializer,一个序列化器的功能是遵循一定的映射规则和编码风格,将一种类型的Java对象通过某种特定的机制,转换成为XML描述的形式;反序列化器的功能是序列化器所做工作的逆操作,两者相辅相成,成对出现。Axis中的序列化/反序列化器采用设计范式中的工厂模式,每一个Serializer唯一对应一个SerializerFactory;每一个Deserializer唯一对应一个DeserializerFactory。一种类型的JAVA对象具体要采用哪个序列化/反序列化器需要在提供Web服务的服务器和调用Web服务的客户端分别配置,关于这一部分如何配置,我将在本文后面的内容中进行具体介绍。Axis已经为开发者提供了丰富的序列化/反序列化器,对于java的基本数据类型,绝大部分常用的容器类(比如数组类型,Vector类型等)都提供了实现,非凡是提供了对W3C的DOM对象(比如Document, Element等)和符合Bean规范的JAVA对象提供了功能完善的序列化/反序列化器,因此我们在需要的时候只要在配置文件中配置一下就可以直接使用。假如对象中包含其它类型的对象,比如Vector中包含一组Bean对象,Axis会自动叠代的调用序列化器,最终拼装成唯一的XML表述。在还原成JAVA对象时,也遵循这样的叠代操作逆向进行。关于Axis到底内置了哪些序列化/反序列化器,您可以参照Axis的API文档中包org.apache.axis.encoding.ser下的类的名称"望文生义"的了解一下,在以后的开发中做到心中有数。但对于一些非凡类型的对象(其实我们自己开发的很大一部分类都是这种非凡类型的对象,很少有绝对符合Bean规范的),需要通过Web服务进行传递,我们不得不开发自己的序列化/反序列化器。
  
  开发篇
  
  开发自己的序列化/反序列化器是一个激动人心的工作,但是却并不复杂,需要做的事情包括实现名成为org.apache.axis.encoding的包中的SerializerFactory,Serializer,DeserializerFactory和Deserializer这四个接口。下面我将结合一个实例来讲解序列化/反序列化器的开发方法,希望读者能够一边参看本文提供的源代码一边学习。
  
  JDOM作为一款比较"另类"的XML解析工具(因为它不符合W3C的DOM模型,自己另立一套)默默地占领着java世界里的xml解析器的半壁江山,由于其简洁的设计和方便灵活的API调用,已经渐渐成为了许多开发人员在进行XML开发的首选。但是Axis是建立在W3C的DOM模型的基础之上,师出名们正派,自然不屑与JDOM为伍。因此当开发人员想将自己已经写好的基于JDOM的应用模块采用Web服务的方式发布的时候,不可避免的会碰到如何将JDOM模型下的对象如Document, Element等序列化的问题。在软件工程师不会自己扩展Axis的序列化/反序列化器的时候,我们只能有两个办法达到这个目的,第一个就是更改以前应用模块内的API设计,使暴露的入口参数和返回值参数都是W3C的对象类型,但这种做法并不现实,因为这一应用模块往往不是独立存在,牵一发将动全身,导致旧有系统架构的崩塌;另一种做法就是为这个模块做一个代理类,它做的工作就对外接收或返回DOM模型的对象,对内转换成JDOM模型的对象,然后转发给应用模块,繁琐且效率低下。当我们向Axis注入了针对于JDOM模型的序列化/反序列化器后,这一工作便可以由Axis代劳了。下面我们将逐个开发这四个类:
  
  JDomElementSerializerFactory
  
  JDomElementSerializerFactory是一个工厂类,需要通过某种机制注册到Axis引擎(具体方法见下面"服务器端应用篇");Axis通过调用它,来实例化JDomElementSerializer。Axis 提供了BaseSerializerFactory,这个类是一个抽象类,并实现其中包含了一些可重用的代码。我们自己开发的工厂类只需简单继续这个类就可以。构造函数中需要调用父类的构造函数将序列器类下面是它的源代码:
  
  package org.apache.axis.encoding.ser;
  
  public class JDomElementSerializerFactory
  extends BaseSerializerFactory {
  
  public JDomElementSerializerFactory() {
  super(JDomElementSerializer.class);
  }
  }
  
  JDomElementSerializer
  
  JDomElementSerializer实现org.apache.axis.encoding.Serializer接口,其核心API是serialize(),我们需要在这个方法的内部完成对JDOM模型的Element的序列化工作,序列化的结果要保存在入口参数传入的序列化上下文对象(SerializationContext)中:
  
  public void serialize(QName name, Attributes attributes, Object value,
  SerializationContext context) throws java.io.IOException {
  
  if (!(value instanceof Element))
  throw new IOException(
  Messages.getMessage("cant Serialize Object"));
  
  //获取符合JDOM的Element对象
  Element root=(Element)value;
  
  //输出到StringWriter
  XMLOutputter outputter=new XMLOutputter();//创建一个JDOM的XML输出器
  StringWriter sw=new StringWriter();
  outputter.output(root,sw);
  
  //用支持W3C的DOM模型的Xerces解析器解析文本流
  DOMParser parser=new DOMParser();//创建一个DOM的XML解析器
  try {
  parser.parse(new org.xml.sax.InputSource(
  new java.io.StringReader(sw.toString())));
  }catch (Exception ex) {
  throw new java.io.IOException("序列化时产生错误");
  }
  
  //获取符合DOM模型的Element对象
  org.w3c.dom.Element w3c_root =
  parser.getDocument().getDocumentElement();
  
  //放入序列化上下文对象中
  context.startElement(name, attributes);
  context.writeDOMElement(w3c_root);
  context.endElement();
  }
  
  JDomElementDeserializerFactory
  
  反序列化器的工厂类同序列化器的工厂类一样的设计,在此不在赘述。代码:
  
  package org.apache.axis.encoding.ser;
  
  public class JDomElementDeserializerFactory
  extends BaseDeserializerFactory {
  
  public JDomElementDeserializerFactory() {
  super(JDomElementDeserializer.class);
  }
  
  }
  
  JDomElementDeserializer
  
  用过SAX解析XML的读者,对反序列化的实现比较轻易理解,反序列化也采用了消息触发的机制,我们只需继续org.apache.axis.encoding.DeserializerImpl类,并覆盖其中的onEndElement方法:
  
  /**
  * 在元素结束触发反序列化的方法
  * @param namespace String 命名空间
  * @param localName String 本地名称
  * @param context DeserializationContext 反序列化上下文
  * @throws SAXException
  */
  public void onEndElement(String namespace, String localName,
  DeserializationContext context) throws SAXException {
  
  try {
  //从反序列化上下文对象中获取原始的消息元素
  MessageElement msgElem = context.getCurElement();
  if (msgElem != null) {
  MessageContext messageContext = context.getMessageContext();
  Boolean currentElement = (Boolean) messageContext.getProperty(
  DESERIALIZE_CURRENT_ELEMENT);
  
  //假如当前的消息元素本身需要反序列化
  if (currentElement != null && currentElement.booleanValue()) {
  org.w3c.dom.Element element = msgElem.getAsDOM();
  org.jdom.input.DOMBuilder db=new org.jdom.input.DOMBuilder();
  value=db.build(element);
  messageContext.setProperty(DESERIALIZE_CURRENT_ELEMENT,
  Boolean.FALSE);
  return;
  }
  
  //反序列化消息元素中的消息体
  java.util.ArrayList children = msgElem.getChildren();
  if (children != null) {
  
  //取得消息体
  msgElem = (MessageElement) children.get(0);
  if (msgElem != null) {
  org.w3c.dom.Element ret = msgElem.getAsDOM();
  org.jdom.input.DOMBuilder db=new org.jdom.input.DOMBuilder();
  
  //用DOMBuilder将DOM模型的Element,转换成JDOM模型的Element
  value=db.
上一篇:JCreator Pro 2.5与WTK2.2配置(上) 人气:668
下一篇:分享:轻松维护RDF元数据模型(图) 人气:813
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-10 企业网站智能管理系统(TZIMS) v6
2008-10-10 拓文asp.net网站内容管理系统 v6
2008-10-10 动网论坛PHP版 v2.0++ Build 081
2008-10-10 免费时代CMS v5.0
2008-10-10 wodig第四季中文DIGG社区 v4.1 b
2008-10-10 老Y文章管理系统 v2.2 bulid 081
2008-10-10 魔法盒动感相册 ASP+SQL版 v2.0
2008-10-10 Asoft签到管理系统 v3.0 Pack1
2008-10-10 哥特人音乐网潮流留言本 v1.1
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成