Java Xstream:解组内部类
我想对其字段属于类的内部类(如果我没有错的话是合成类)的对象进行marshall和unmarshall处理 并从XML生成和读取: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中输入要解组的
<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);
}
}
}