castor 应用中遇到的问题

原创 2007年10月13日 20:50:00

以下所有基本上都是从castor文档上copy过来的,只是在这次项目应用中遇到了这些问题,记录下。

castor虽然用起来很简单,可是用的好却不简单。这里只是提一些使用中的遇到的问题:

1.缩进问题和命名规范。

org.exolab.castor.indent=true
org.exolab.castor.xml.naming=mixed

加上上面的第一个属性就能使产生的xml有缩进,格式比较好看(调试的时候可以用用,正式环境还是去掉比较好)

第二属性设置后,生成的xml的元素名称就可以达到基本符合java的命名规范。

还可以使用<class name="com.acme.Foo" auto-complete="true"/> auto-complete来化繁为简(不用写具体的绑定配置拉)

2.性能问题

castor每次在loadingMapping的时候都会生成ClassDescriptorResolver(大概就是用来将xml的类配置信息映射到对象),如果用castor的quick start里的那种方式可能会有性能问题(其实差的不是很多,经过过我测试,序列化500个对象采用这种方式和后面将要用的新方式只是查了3倍左右。平均时间:10ms<->3ms),以下是缓存ClassDescriptorResolver的解决方案:

 

public class MappingUtils ...{

    
private static Log log = LogFactory.getLog(MappingUtils.class);

    
public static <T> T deserialize(Reader reader, Class<T> clazz) ...{
        URL mappingFile 
= clazz.getResource(clazz.getSimpleName()
                
+ "-mapping.xml");
        
try ...{
            ClassDescriptorResolver resolver 
= getCachedResolver(mappingFile);
            Unmarshaller unmarshaller 
= new Unmarshaller();
            unmarshaller.setResolver((XMLClassDescriptorResolver)resolver);
            
return clazz.cast(unmarshaller.unmarshal(reader));
        }
 catch (Exception e) ...{
            log.error(
"", e);
            
return null;
        }

    }


    
public static void serialize(Writer writer, Object obj) ...{
        Class clazz 
= obj.getClass();
        serialize(writer, obj, clazz.getResource(clazz.getSimpleName()
                
+ "-mapping.xml"));
    }


    
public static void serialize(Writer writer, Object obj, URL mappingFile) ...{
        Marshaller marshaller 
= new Marshaller();

        
try ...{
            ClassDescriptorResolver resolver 
= getCachedResolver(mappingFile);
            marshaller.setResolver((XMLClassDescriptorResolver) resolver);

            marshaller.setWriter(writer);
            marshaller.marshal(obj);
        }
 catch (Exception e) ...{
            log.error(
"", e);
        }

    }


    
private static Map<Object, ClassDescriptorResolver> resolverCache = new HashMap<Object, ClassDescriptorResolver>();

    
private static ClassDescriptorResolver getCachedResolver(URL mappingFile)
            
throws Exception ...{

        ClassDescriptorResolver resolver 
= resolverCache.get(mappingFile
                .getFile());

        
if (resolver == null...{
            Mapping mapping 
= new Mapping();

            mapping.loadMapping(mappingFile);

            resolver 
= ClassDescriptorResolverFactory
                    .createClassDescriptorResolver(BindingType.XML);
            MappingUnmarshaller mappingUnmarshaller 
= new MappingUnmarshaller();
            MappingLoader mappingLoader 
= mappingUnmarshaller.getMappingLoader(
                    mapping, BindingType.XML);
            resolver.setMappingLoader(mappingLoader);
            resolverCache.put(mappingFile.getFile(), resolver);
        }

        
return resolver;
    }

}

 

3. 直接序列化List对象

castor支持序列化一个list到xml!其实我也是试出来的,本来以为所有序列化对象都要是xml中的带有map-to顶层元素类。

你只需要定义list中对象的类映射到mapping文件就可以直接序列化一整个list了,大概像下面的这段代码

public void serializeList(Writer writer,List obj,URL mappingFile) ...{
        XMLContext context 
= new XMLContext();
        Mapping mapping 
= XMLContext.createMapping();
        
try ...{
            mapping.loadMapping(mappingFile);
            context.addMapping(mapping);
            
            Marshaller marshaller 
= context.createMarshaller();
            marshaller.setSuppressXSIType(
true);//去掉xsi:type
            marshaller.setRootElement("root");//给顶层元素改个名字
            marshaller.setWriter(writer);
            marshaller.marshal(obj);
        }
 catch (Exception e) ...{
            log.error(
"", e);
        }

    }

我使用Castor的心得(一)

我使用Castor的心得 Castor项目的官方网址是http://www.castor.org/借用该网站上的介绍,让我们一起来看看castor是个什么东西?Castor is an Open So...
  • derekjiang
  • derekjiang
  • 2009-09-02 17:50:00
  • 2704

用Castor 处理XML文档

——Castor可以完成Java和XML的相互转换 前面有介绍过json-lib这个框架,在线博文:http://www.cnblogs.com/hoojo/archive/2011/04/21...
  • xyw591238
  • xyw591238
  • 2016-07-18 16:52:51
  • 616

Castor格式化输出

使用castor版本:1.3.1   原因: 查看castor-1.3.1-xml.jar中的castor.xml.properties(在\org\castor\xml目录下) 找到org....
  • lalicw
  • lalicw
  • 2013-05-07 21:25:55
  • 388

Castor学习笔记一 -- 使用Castor XML

备注:Jakarta ORO: 一套文本处理工具,提供JDK5.0兼容的正则表达式,Awk-like正则表达式,glob表达式Xerces:Apache推动的一项XML文档解析开源项目,有多种语言版本...
  • buoymp
  • buoymp
  • 2006-09-04 16:31:00
  • 2977

Castor XML

  Castor XMLCastor XML作为一个数据绑定框架,可以实现任何类似Java Bean的对象和XML文档表示之间的相互转换。通常情况下,Castor使用一组类描述符(ClassDescr...
  • adevotee
  • adevotee
  • 2009-02-08 19:10:00
  • 3276

castor 应用中遇到的问题

以下所有基本上都是从castor文档上copy过来的,只是在这次项目应用中遇到了这些问题,记录下。castor虽然用起来很简单,可是用的好却不简单。这里只是提一些使用中的遇到的问题:1.缩进问题和命名...
  • floyddcn
  • floyddcn
  • 2007-10-13 20:50:00
  • 747

castor使用

lib : castor-xml.jar  ,xerces.jarbean:TestBean.javapublic class TestBean{ private String m_carrier; ...
  • weiyingyi0
  • weiyingyi0
  • 2006-06-08 17:46:00
  • 1612

html中一些常见问题的解决方法

扯扯淡:第一次写博客,最近在学习html5,把遇到的坑记录下来,一是能加深一下印象,二能帮助一下遇到相同坑的童鞋,三能锻炼自己的表达能力,一举三得,哈哈,如有错误欢迎批评指正......... ...
  • qq289223562
  • qq289223562
  • 2016-10-13 22:47:17
  • 713

Castor功能与应用参考-XML框架

索引1. 项目简介2. Castor功能特性3. Castor XML3.1 XML编组框架3.1.1 自省方式(introspection)的编组与解编3.1.2 使用映射文件方式的编组与解编3.1...
  • lucifer821031
  • lucifer821031
  • 2008-01-17 17:33:00
  • 1241

初学ASP.NET开发web应用时遇到的一些常见问题和解决方法

第一个问题:在安装Microsoft Visual Studio .NET2003时,没有安装IIS,而是后安装的IIS,这种情况下,创建web应用时会报错解决方法:在命令提示窗口中运行如下命令即可:...
  • Improving
  • Improving
  • 2006-05-17 13:39:00
  • 897
收藏助手
不良信息举报
您举报文章:castor 应用中遇到的问题
举报原因:
原因补充:

(最多只允许输入30个字)