jaxb反序列化XML以在Java中动态创建类
我有一组抽象类,如下所示:
abstract class A {
public abstract B getB() {return this.b;}
public abstract void setB(B b) {this.b = b;}
}
abstract class B {
public abstract C getC() {return this.c;}
public abstract void setC(C c) {this.c = c;}
}
abstract class C {
private String foo;
public String getFoo() {return this.foo;}
public void setFoo(String foo) {this.foo = foo;}
}
在运行时,我使用ByteBuddy为这些类创建代理。我可以轻松地将这些代理类的对象序列化为XML。但是当我尝试反序列化XML时,JAXB抛出javax.xml.bind.UnmarshalException: Unable to create an instance of A
,因为它无法创建抽象类的实例。我想向它展示如何在运行时创建这些实例,以便对它们进行反序列化(我有一个特殊的SpringBean,它可以做到这一点,所以我需要能够在定义创建逻辑的任何地方注入它),我查看了JAXB和Jackson,但找不到如何做到这一点
有办法吗?我不受任何序列化框架的约束,不过最好还是使用JAXB或Jackson
# 1 楼答案
我发现JAXB和Jackson都能做到这一点
JAXB提供了两种解决方法:工厂方法和适配器
使用JAXB工厂方法,我需要创建一个负责对象创建的工厂:
然后我只需要用
@XmlType
注释标记我的抽象类:如果我想使用JAXB适配器,我需要创建JAXB可以从XML实例化和填充的Java类,然后我需要将这些类的对象转换为我需要的对象:
然后我将用
@XmlJavaAdapter
注释标记我的抽象类:使用Jackson,我可以为抽象类创建自定义反序列化程序
在代码的后面部分,我需要注册反序列化程序:
出于我的目的,我更喜欢Jackson自定义反序列化程序,因为: