java - 如何在航类从 xml 创建类和对象?

标签 java xml serialization reflection deserialization

我有一个具有以下结构的 XML 文件:

<object type="People">
    <field id="name" type="class java.lang.String" value="Ivan"/>
    <field id="age" type="class java.lang.Integer" value="23"/>
    <field id="salary" type="class java.lang.Double" value="50.0"/>
</object>

但是对象类型和字段可以不同。

例如:

<object type="Worker">
    <field id="lastName" type="class java.lang.String" value="Ivan"/>
    <field id="height" type="double" value="170.00"/>
    <field id="salary" type="double" value="50.0"/>
</object>

是否可以从具有未知字段的 XML 创建对象?

最佳答案

当生活为您提供灵活的对象时,包装器就是您的 friend 。

您的“XmlObject”理想情况下应如下所示。

public class XmlObject {
    final String type; 
    Map<String, ObjectWrapper> map = new Map<>();

    public XmlObject(String type) {
        this.type = type;
    }

    public void put(String key, ObjectWrapper object) {
        map.add(key, object);
    }

    public ObjectWrapper get(String key) {
        return map.get(key);
    }
}

然后,您的包装器使用泛型,并可以选择返回类类型。

public class ObjectWrapper<T> {

    private T value;

    public ObjectWrapper (T value) {
        this.value = value;
    }

    //from http://stackoverflow.com/a/8019188/2958086
    public Class<T> getPersistentClass() {
        if (persistentClass == null) {
            this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        }
        return persistentClass;
    }
}

如果需要,您可以在声明时提供对象类型,以及任何类型的类型解析或数据转换。我假设这些类型是标准的可解析类型,因此您可以在 XML 解析器中根据类型进行处理和存储。

String key, type, value; //from xml;
ObjectWrapper object;
if(type.contains("String")) {
    object = new ObjectWrapper<String>(value);
}
else if(type.contains("Double")) {
    object = new ObjectWrapper<Double>(Double.parseDouble(value));
}

xmlObject.add(key, object);

之后,您可以根据键获取对象,或者使用标准映射函数获取键映射。要获取对象的类型,您可以获取其持久类。

关于java - 如何在航类从 xml 创建类和对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42211170/

相关文章:

java - Java 中以数字开头,然后是点和逗号的字符串

xml - 为什么 XML 元素无效?

c# - 反序列化为正确的子对象

java - 序列化 Java 对象时是否可以捕获对象字段和方法的字节偏移量?

java - ClassNotFoundException:derby ClientDriver(Spring MVC + Hibernate JPA)

java - 最小化所有应用程序

java - 如何使用 PowerMockito 模拟私有(private)字段?

sql - 无法从命名空间读取 xml 节点

xml - 将日期从 yyyy-mm-dd 转换为 dd/mm/yyyy 以满足 xslt 中的空日期或空日期

java - 序列化和数据库存储的区别