我目前正在尝试使用简单的xml api(http://simple.sourceforge.net/)序列化具有重复元素的对象树。
以下是创建树的类:
@Root(name = "build", strict = false)
public class Build {
@Element
public Repository repository;
@Element
public Project project;
}
@Root
public class Project {
@Element
public Repository repository;
}
@Root
public class Repository {
@Element
public String url;
}
这是树:注意:Build和Project都引用相同的存储库(重复元素)。
Build build = new Build();
Project project = new Project();
Repository repository = new Repository();
repository.url = "http://my-repository.com";
build.project = project;
build.repository = repository;
project.repository = repository;
如果我在没有任何策略的情况下序列化树:
Persister persister = new Persister();
persister.write(build, new FileOutputStream(new File(
"build-default-strategy.xml")));
然后我得到了
<build>
<repository>
<url>http://my-repository.com</url>
</repository>
<project>
<repository>
<url>http://my-repository.com</url>
</repository>
</project>
</build>
这不是我想要的,因为存储库也在xml中重复。
如果我使用循环策略,那我就更近了一步:
Strategy strategy = new CycleStrategy("id", "ref");
Persister persister = new Persister(strategy);
persister.write(build, new FileOutputStream(new File(
"build-cycle-strategy.xml")));
输出:
<build id="0">
<repository id="1">
<url id="2">http://my-repository.com</url>
</repository>
<project id="3">
<repository ref="1"/>
</project>
</build>
这也不行,因为我还希望xml文件可以编辑。在这 case(例如,如果你添加一个新的存储库),那么你必须自己分配id, 这是不切实际的(“真正的”对象树要大得多)。
我想要的是一个xml文件,其中只给出了重复的元素 ID:
<build>
<repository id="1">
<url>http://my-repository.com</url>
</repository>
<project>
<repository ref="1"/>
</project>
</build>
如果你知道如何实现这一点,请帮助我。感谢。
注意:http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#reuse 是一个相关的例子。