gpt4 book ai didi

java - 如何编码和解码对象类型字段?

转载 作者:行者123 更新时间:2023-11-30 04:00:46 25 4
gpt4 key购买 nike

我有一个带有通用方法的接口(interface)

public interface A {
public void setValue(Object value);
public Object getValue();
}

实现此接口(interface)但将值限制为某个特定枚举类的类(例如,值为 X、Y、Z):

public class B implements A {
private MyEnum value=null;
public Object getValue() { return value; }
public void setValue(Object value) {
if (!(value instanceof MyEnum)) throw IllegalArgumentException(...);
this.value=(MyEnum)value;
}
}

对于编码和解码,我编写了一个特定的转换器对于编码我有

public boolean canConvert(Class clazz) {
return A.class.isAssignableFrom(clazz);
}

public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
...
A entry = (A) source;
writer.startNode("value");
context.convertAnother(entry.getValue());
writer.endNode();
...
}

这将生成 B 类的实例

...
<value>X</value>
...

XStream没有添加任何关于该字段的类的指令。只是枚举的字符串值。

对于解码,我有:

public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
...
reader.moveDown();
Object type = context.convertAnother(extra, Object.class);
extra.setValue(type);
reader.moveUp();
...
return extra;
}

我放置了Object.class,因为我不知道它包含哪种对象类型。我希望 XStream 能够添加一些相关信息。

这会失败,因为Object type = context.convertAnother(extra, Object.class)与“X”字符串一起使用,它不是必须生成一个类型为MyEnum的对象 这是 extra.setValue(type) 所期望的。

如何强制或添加信息以便 XStream 知道它必须生成的对象类型?

感谢您阅读这篇长文...

最佳答案

我遵循此处的建议,添加了一些有关该值的类的信息,并用它来解码。我将我的工作解决方案发布为可能发现此问题的任何其他读者的引用:

public static class ExtraSearchOptionConverter implements Converter {
public boolean canConvert(Class type) {
return ExtraSearchOption.class.isAssignableFrom(type);
}
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
ExtraSearchOption entry = (ExtraSearchOption) source;
...
if (entry.getValue() != null) {
writer.startNode("value");
writer.addAttribute("class", entry.getValue().getClass().getName());
context.convertAnother(entry.getValue());
writer.endNode();
}
}
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
ExtraSearchOption extra = new ExtraSearchOption();
...
if (reader.hasMoreChildren()) {
reader.moveDown();
String className = reader.getAttribute("class");
Class<?> valueClass = null;
if (className != null) {
try {
valueClass = Class.forName(className);
Object type = context.convertAnother(extra, valueClass);
extra.setValue(type);
} catch (ClassNotFoundException ex) {
logger.error("While retrieving class for ExtraSearchOptions value", ex);
}
}
reader.moveUp();
}

return extra;
}

}

关于java - 如何编码和解码对象类型字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22028935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com