Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我能在多大程度上改变我的数据模型并仍然使用XStream/JAXB?_Java_Xml_Jaxb_Xstream - Fatal编程技术网

Java 我能在多大程度上改变我的数据模型并仍然使用XStream/JAXB?

Java 我能在多大程度上改变我的数据模型并仍然使用XStream/JAXB?,java,xml,jaxb,xstream,Java,Xml,Jaxb,Xstream,我在一个负责编写新版本软件包的团队中。旧版本使用XStream进行序列化。对于新版本,我们希望重新组织数据模型,这将反过来要求输出文件采用新格式。我们需要支持读取旧数据格式,并且有不止一种旧格式 例如,在旧版本中,我可能有这样的数据结构,其中每个元素都是不同的(非POJO)类: 然而,现在我可能想重构,A的实例现在是B的子对象,I的内容被分开并分别移动: root + i.1 + C + i.2 + B + A

我在一个负责编写新版本软件包的团队中。旧版本使用XStream进行序列化。对于新版本,我们希望重新组织数据模型,这将反过来要求输出文件采用新格式。我们需要支持读取旧数据格式,并且有不止一种旧格式

例如,在旧版本中,我可能有这样的数据结构,其中每个元素都是不同的(非POJO)类:

然而,现在我可能想重构,
A
的实例现在是
B
的子对象,
I
的内容被分开并分别移动:

root
    + i.1
    + C
        + i.2
        + B
            + A
            + 1
            + 2
        + B
            + A
            + 1
            + 2
我不确定这是否代表了我想要做的事情,但这是我担心的一部分。我们不确定我们是否知道我们想要什么样的数据模型,也不确定我们将来不会再改变它。我不仅仅是添加、删除或重命名对象:我想移动/复制它们

当向后兼容性不是问题时,Xstream和JAXB非常适合序列化对象。XStream有一个描述简单更改的解决方案,但我想知道他们对于足够复杂的情况提出的“实现您自己的转换器”的建议是否意味着我应该完全跳过XStream。其他人也提出了问题


我可以使用xstream/JAXB来支持将我演示的不同数据格式读入同一数据模型吗?我的猜测是否定的,因为我太没经验了,不能肯定。

我给了xstream一次机会,它成功了。我首先只为顶级标记注册了一个转换器:

TopLevel topLevel = new TopLevel();
xstream = new XStream(new DomDriver());
xstream.registerConverter(new TopLevelConverter(topLevel));
xstream.alias("TopLevel", TopLevel.class);
xstream.fromXML(data);
每个转换器为每个后续类型的节点引入新的转换器,例如在TopLevelConverter中:

public Object unmarshal(HierarchicalStreamReader reader,
                        UnmarshallingContext context) {
    while (reader.hasMoreChildren()) {
        reader.moveDown();
        if("SecondLevel".equals(reader.getNodeName())){
            SecondLevel secondLevel =
                (SecondLevel)context.convertAnother(topLevel,
                    SecondLevel.class,
                    new SecondLevelConverter(topLevel));
            topLevel.add(secondLevel);
        }
        reader.moveUp();
    }
    return topLevel;
}
其中,
SecondLevelConverter
反过来也调用
convertOther
。通过这种方式,我可以通过转换器的构造函数传递对象来做任何我想做的事情:有时向下发送数据供子级使用,有时向下发送更高级别的引用,以便子级转换器可以调用set方法

然而,这可能与我在没有xstream的情况下所做的类似,因此我不确定xstream在这种特定情况下为我买了什么

public Object unmarshal(HierarchicalStreamReader reader,
                        UnmarshallingContext context) {
    while (reader.hasMoreChildren()) {
        reader.moveDown();
        if("SecondLevel".equals(reader.getNodeName())){
            SecondLevel secondLevel =
                (SecondLevel)context.convertAnother(topLevel,
                    SecondLevel.class,
                    new SecondLevelConverter(topLevel));
            topLevel.add(secondLevel);
        }
        reader.moveUp();
    }
    return topLevel;
}