Java Xstream:解组内部类

Java Xstream:解组内部类,java,unmarshalling,xstream,Java,Unmarshalling,Xstream,我想对其字段属于类的内部类(如果我没有错的话是合成类)的对象进行marshall和unmarshall处理 并从XML生成和读取: <A> <field_B>b1</field_B> </A> context.getCurrentObject()返回空值,并且似乎已过时(从我阅读的论坛中) context.get(“current\u unmarshalled\u A”)将要求我在这个unMarshallingContext中输入要解组的

我想对其字段属于类的内部类(如果我没有错的话是合成类)的对象进行marshall和unmarshall处理

并从XML生成和读取:

<A>
    <field_B>b1</field_B>
</A>
context.getCurrentObject()
返回空值,并且似乎已过时(从我阅读的论坛中)

context.get(“current\u unmarshalled\u A”)
将要求我在这个unMarshallingContext中输入要解组的键和对象。我发现如果不写一个改头换面的人,我是不会这么做的。这并不是很好,因为我会取消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);
        }
    }
}
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);
        }
    }
}