Java xStream深嵌套。延迟初始化
想象下面的类,代表Vagon:Java xStream深嵌套。延迟初始化,java,nested,xstream,self-reference,Java,Nested,Xstream,Self Reference,想象下面的类,代表Vagon: class Vagon { int id; Vagon nextVagon; } 它只有两个字段:id和对下一个类实例的引用。 因此,假设我们有一个表示序列的对象列表(第一个构造函数arg是id,第二个-nextVagon ref): 其中,vagon0-是最后一个,在他旁边是vagon1,依此类推。 所以,当我使用xstream序列化这个vagons列表时,我得到了如下smth:
class Vagon {
int id;
Vagon nextVagon;
}
它只有两个字段:id和对下一个类实例的引用。
因此,假设我们有一个表示序列的对象列表(第一个构造函数arg是id,第二个-nextVagon ref):
其中,vagon0-是最后一个,在他旁边是vagon1,依此类推。
所以,当我使用xstream序列化这个vagons列表时,我得到了如下smth:
<list>
<TrainTest_-Vagon>
<id>0</id>
<nextVagon>
<id>1</id>
<nextVagon>
<id>2</id>
<nextVagon>
<id>3</id>
<nextVagon>
<id>4</id>
<nextVagon>
<id>5</id>
</nextVagon>
</nextVagon>
</nextVagon>
</nextVagon>
</nextVagon>
</TrainTest_-Vagon>
<TrainTest_-Vagon reference="../TrainTest_-Vagon/nextVagon"/>
<TrainTest_-Vagon reference="../TrainTest_-Vagon/nextVagon/nextVagon"/>
<TrainTest_-Vagon reference="../TrainTest_-Vagon/nextVagon/nextVagon/nextVagon"/>
<TrainTest_-Vagon reference="../TrainTest_-Vagon/nextVagon/nextVagon/nextVagon/nextVagon"/>
<TrainTest_-Vagon reference="../TrainTest_-Vagon/nextVagon/nextVagon/nextVagon/nextVagon/nextVagon"/>
</list>
0
1.
2.
3.
4.
5.
所以事实上,我有第一个大的vagon0,它包含了所有其他的Vagon,以及其他的列表成员,都是refereces
问题是
1) 若列表大小非常大,xStream由于堆栈限制而无法序列化它—我只是得到StackOverflow错误。
2) 输出很难理解:我希望有这样的东西:
<list>
<TrainTest_-Vagon>
<id>0</id>
<nextVagon reference="..ref to vagon1..">
</TrainTest_-Vagon>
<TrainTest_-Vagon>
<id>1</id>
<nextVagon reference="..ref to vagon2..">
</TrainTest_-Vagon>
<TrainTest_-Vagon>
<id>2</id>
<nextVagon reference="..ref to vagon3..">
</TrainTest_-Vagon>
<TrainTest_-Vagon>
<id>3</id>
<nextVagon reference="..ref to vagon4..">
</TrainTest_-Vagon>
<TrainTest_-Vagon>
<id>4</id>
<nextVagon reference="..ref to vagon5..">
</TrainTest_-Vagon>
<TrainTest_-Vagon>
<id>5</id>
<nextVagon reference="..null..">
</TrainTest_-Vagon>
</list>
0
1.
2.
3.
4.
5.
因此,从技术的角度来看,我认为我们谈论的是懒惰的编组——首先是marsal vagons将“nextVagon”留空——然后当我们在内存中进行所有训练时,插入引用。
有没有办法在xStream中实现这一点,否则我将不得不编写自己的转换器到TrainList
编辑:在现实生活中,Vagon类也可以将成员ref设置为previousVagon,甚至可以将可以连接到它的Vagon列表,因此我们无法通过更改列表顺序(序列化顺序)来解决此问题我们应该假设每个迷走神经都引用了另一个。 如果看起来可行,考虑在序列化之前还原列表——这将使XSuto呈现与你所期望的相似的XML。 < P>唯一的方法是用自己的<代码>转换器< /代码>。XStream没有任何内置的延迟编组机制 关于转换为列表:如果Vagons可以引用上一个和下一个Vagons,则并不总是能够对它们进行排序,以便您已经编组了上一个/下一个引用。如果您还没有封送引用,那么XStream将在适当的位置封送引用,您仍然会得到一个嵌套的布局 如果您确实不想制作转换器,可能的解决方法:
- 听起来你的阴道可能是树状结构。如果删除
引用,则可以将它们作为列表从叶子向上排序previousVagon
- 您可以使用
来防止XStream序列化上一个/下一个引用,但随后必须单独存储引用(例如映射),并在解组后修复它们。此外,这些引用不会显示在Vagon列表中,因为它们被省略了。您将得到如下结果:ommitfield
<VagonHolder> <vagonList> <Vagon> <id>1</id> </Vagon> <Vagon> <id>2</id> </Vagon> <Vagon> <id>3</id> </Vagon> </vagonList> <nextVagonsMap> <entry> <Vagon reference="../../../vagonList/Vagon"/> <Vagon reference="../../../vagonList/Vagon[2]"/> </entry> <entry> <Vagon reference="../../../vagonList/Vagon[2]"/> <Vagon reference="../../../vagonList/Vagon[3]"/> </entry> </nextVagonsMap> </VagonHolder>
1. 2. 3.
<VagonHolder>
<vagonList>
<Vagon>
<id>1</id>
</Vagon>
<Vagon>
<id>2</id>
</Vagon>
<Vagon>
<id>3</id>
</Vagon>
</vagonList>
<nextVagonsMap>
<entry>
<Vagon reference="../../../vagonList/Vagon"/>
<Vagon reference="../../../vagonList/Vagon[2]"/>
</entry>
<entry>
<Vagon reference="../../../vagonList/Vagon[2]"/>
<Vagon reference="../../../vagonList/Vagon[3]"/>
</entry>
</nextVagonsMap>
</VagonHolder>