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 xml解析

使用xstream的bean转xml,总有问题,类的名字一长串,还包含$$enhanced_cglib 字样,因为用的是hibernate,取出来的bean都是cglib的代理类,转成xml后,里...
  • zhang8mss
  • zhang8mss
  • 2011年04月11日 18:51
  • 1489

Castor实现XML与Java的互转

Castor是一个开源的XML数据绑定java组件工具,在XML数据交换方面很有用。 http://www.castor.org/     刚开始研究,找了些文档看看: ht...
  • miqi770
  • miqi770
  • 2015年12月29日 17:12
  • 1213

用Castor 处理XML文档

——Castor可以完成Java和XML的相互转换 前面有介绍过json-lib这个框架,在线博文:http://www.cnblogs.com/hoojo/archive/2011/04/21/2...
  • yehangdx
  • yehangdx
  • 2013年03月03日 23:59
  • 271

用Castor 处理XML文档

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

用Castor 处理XML文档

用Castor 处理XML文档 ——Castor可以完成Java和XML的相互转换 前面有介绍过json-lib这个框架,在线博文:http://www.cnblogs.com/hoojo/...
  • liyunyun6
  • liyunyun6
  • 2014年06月12日 16:32
  • 413

用Castor处理XML文档

——Castor可以完成Java和XML的相互转换 前面有介绍过json-lib这个框架,在线博文:http://www.cnblogs.com/hoojo/archive/2011/04/21...
  • u012959829
  • u012959829
  • 2014年12月11日 15:21
  • 567

dubbo 常见的问题bug梳理

一、服务器部署dubbo服务,本地无法调试1.注册中心为:zookeeper2.调试过程: 代码有bug 未提交完全代码 xml配置项错误 内网ip被限制,被加入黑名单 tomcat配置错误 排除上述...
  • u012578757
  • u012578757
  • 2015年10月15日 10:48
  • 1672

Spring4源码下载编译并导入eclipse

本文是笔者为了阅读spring源码,学习并提升自己,才下载了源码,但在编译过程中踩过不少的坑,看过不少人写的文章,但是我遇到的问题,很多人都好像没有遇到过一样,顺风顺水,为了避免以后踩同样的坑,所以特...
  • vinvis
  • vinvis
  • 2017年04月19日 15:38
  • 1244

运用kmp算法解决的一些问题的简单题解

学习kmp算法我最后是看的数据结构书上的一本教材学会的。。我觉得kmp相对于普通的BF算法就是避免了很多不必要的匹配,而kmp算法的精髓自然就在于next数组的运用。。。而next数组简而言之就是存储...
  • u014303647
  • u014303647
  • 2014年08月04日 11:07
  • 892

分治算法在树的路径问题上的应用(总结)

转自IOI2009 中国国家集训队论文   分治算法在树的路径问题中的应用 【摘要】           树作为一类特殊的数据结构,在信息学中有着极为重要的作用,各类关于树的题目在竞赛中...
  • u014665013
  • u014665013
  • 2017年05月04日 10:09
  • 668
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:castor 应用中遇到的问题
举报原因:
原因补充:

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