问题:给定一个通用的包装类,如何在这种类型的字段上指定XmlAdapter,然后将其用于序列化包装的值?
我有一个包含几个通用类型成员的类(包含一些业务逻辑,但它归结为此问题的类型化包装类),我想序列化,同时使用注释指定包装值的XmlAdapter该领域。
假设我们有一袋属性:
class Bag {
public Property<TypeA> propertyA = new Property<TypeA>();
public Property<TypeB> propertyB = new Property<TypeB>();
}
class Property<T extends Object> {
T value;
@XmlElement
public T getValue()
public T setValue(T value)
// ...
}
只要TypeA或TypeB知道XmlAdapter或者按照定义可序列化,就可以很好地序列化/反序列化。
<Bag>
<propertyA>myAValue</propertyA>
<property>myBValue</propertyB>
</Bag>
在某些情况下,propertyA的值必须使用特定的XmlAdapter进行(反)序列化,例如:因为ist运行时值是从XML中的信息动态创建的。
要为类的成员指定XmlAdapter,通常可以使用@XmlJavaTypeAdapter Annotation。
据我所知,这个过程并不直接适用于此。 就我而言,我想在序列化Propertys值(例如propertyA.getValue())时使用适配器来注释“propertyA”字段。
理想情况下,它应如下所示。
class Bag {
@PropertyValueAdapter(TypeAdapterForA.class)
public Property<TypeA> propertyA = new Property<TypeA>();
//...
}
// This generically adapts TypeA
class TypeAdapterForA extends XmlAdapter<Object, TypeA> {
public TypeA unmarshal(Object element){
// ...
}
然而,我找不到实现这个的好方法。当然,我们可以为我们想要与Property一起使用的每个Type实现适配器类,然后基本上只转发编组,使适配器的数量加倍。一般的方式是可取的。
使用XmlAdapters,(Un)Marshaller.Listener等进行了解决,我想出了一个使用XmlAdapter for Property类的解决方法,它在(通常)设置在对Bag的beforeUnmarshal调用中,以便它可以访问注释并可以手动选择正确的编组。但是,JAXB无法理解此连接(该模型现在不再与生成的XML相对应)。
这感觉不太理想。除了复杂且容易出错外,该模型不再正确反映数据;在解组时,我们无法找到目标(例如我们解组的Bag中的字段)。
所以问题仍然存在,给定一个通用的包装类,如何在这种类型的字段上指定XmlAdapter,然后应该使用它来序列化包装的值?