繁体   English   中英

Xstream:解组内部类

[英]Xstream : unmarshalling inner classes

我想编组和解组对象,这些对象的字段属于其类的内部类(如果我没记错,则为合成类)。

class A {
    private B field_b=null;
    public static class B {
        public static B B1 = new B("b1");
        public static B B2 = new B("b2");

        private final String name;
        private B(String name) {
            this.name=name;
            }
        }
    public B getBforName(String name) {
        if (B1.name.equals(name) return B1;            
        else if (B2.name.equals(name) return B2;
        else return null;            
    }

并产生和读取XML:

<A>
    <field_B>b1</field_B>
</A>

写作部分很容易。

阅读部分比较复杂。

我想写一个转换器:

public class BConverter implements Converter {
    public boolean canConvert(Class type) {
        return B.class.isAssignableFrom(type) ;
    }
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
        // ...
    }
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        A parent_v1 = (A) context.getCurrentObject(); // !!! always empty
        A parent_v2 = (A) context.get("current_unmarshalled_A");

        return parent_v2.getBforName((String)reader.getValue());

    }
}

context.getCurrentObject()返回null,并且似乎已经过时了(从我读过的论坛中)。

context.get("current_unmarshalled_A")要求我在此unMarshallingContext中放入要解组的键和A对象。 如果没有编写AConverter,我就不会这样做。 这不是很整洁,因为我会放弃A类的默认拆组行为。

有人有主意吗?

我不确定这是否是最干净的方法,但是它可以工作。

我在B类中使用静态方法...

class A {
    private B field_b=null;
    public static class B {
        public static B B1 = new B("b1");
        public static B B2 = new B("b2");

        public static B getForName(String name) {
            if (B1.name.equals(name) return B1;            
            else if (B2.name.equals(name) return B2;
            else return null;            
        }

        private final String name;
        private B(String name) {
            this.name=name;
            }
    }

...以及转换器中的反射

public class BConverter implements Converter {
    public boolean canConvert(Class type) {
        return B.class.isAssignableFrom(type) ;
    }
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
        writer.setValue(((B)source).getName())
    }
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        try {
            Method method = context.getRequiredType().getMethod("getForName", String.class);
            final String v = reader.getValue();
            Object b= method.invoke(null, v);
            if (b== null)
                throw new ConversionException("Could not retrieve a B object for \"" + v + "\"");
            return b;
        } catch (Exception ex) {
            throw new ConversionException("Error while retrieving a B object", ex);
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM