【问题标题】:Xstream Implicit Map As Attributes to Root ElementXstream 隐式映射为根元素的属性
【发布时间】:2011-11-28 07:27:24
【问题描述】:

我正在尝试找到一种解决方案,使用 XStream 将地图转换为根元素属性。

我不认为这是可能的,但这是我已经尝试过的。

我创建了一个自定义转换器并将其附加到根对象,然后在转换器中我可以访问我试图转换为属性的地图,我遍历地图并将属性写入节点,使用 writer .addAttribute(entry.getKey(), entry.getValue());这确实将属性写入根节点,例如

这种方法的问题是它不处理文档的其余部分,它只是在处理完地图后停止,为了让它工作,我需要一些方法让默认转换器重新控制并完成模型。

我一直在尝试使用的第二个解决方案是为地图本身创建一个自定义转换器,这种方法的问题是我无法获得根元素的句柄,所以我无法写入它,是否可以通过这种方式访问​​根元素?

谢谢, 乔恩

【问题讨论】:

    标签: java xml xstream


    【解决方案1】:

    创建一个转换器,该转换器写出映射并使用反射转换器重新编组对象:

    static class MyConverter implements Converter {
    
        private final Map<String, String> attributes;
    
        private final Class<?> clazz;
    
        private final Mapper mapper;
    
        private final ReflectionProvider reflectionProvider;
    
        public MyConverter(Mapper mapper,
                ReflectionProvider reflectionProvider, Class<?> clazz,
                Map<String, String> attributes) {
            super();
            this.mapper = mapper;
            this.reflectionProvider = reflectionProvider;
            this.attributes = attributes;
            this.clazz = clazz;
        }
    
        @Override
        public boolean canConvert(Class cls) {
            return cls == clazz;
        }
    
        @Override
        public void marshal(Object value, HierarchicalStreamWriter writer,
                MarshallingContext context) {
            for (String key : attributes.keySet()) {
                writer.addAttribute(key, attributes.get(key));
            }
    
            Converter converter = new ReflectionConverter(mapper,
                    reflectionProvider);
            context.convertAnother(p, converter);
        }
    
        @Override
        public Object unmarshal(HierarchicalStreamReader arg0,
                UnmarshallingContext arg1) {
            // TODO Auto-generated method stub
            return null;
        }
    
    }
    

    从您的 XStream 实例中检索 Mapper 和 ReflectionProvider 实例,并使用所有必要的设置注册一个转换器:

        XStream xs = new XStream(new DomDriver());
        Mapper mapper = xs.getMapper();
        ReflectionProvider reflectionProvider = xs.getReflectionProvider();
        xs.alias("youralias", YourRoot.class);
        xs.registerConverter(new MyConverter(mapper, reflectionProvider,
                YourRoot.class, map));
    
        System.out.println(xs.toXML(yourRoot));
    

    【讨论】:

    • 是否可以从注解中检索 XStream 实例?
    • 您好,能否请您说明一下unmarshal() 方法的实现?我遇到了同样的问题,我相信这会很有帮助。 (也许你可以检查stackoverflow.com/questions/17086757/…
    • context.convertAnother(p, 转换器);什么是“p”?
    猜你喜欢
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    相关资源
    最近更新 更多