Java xStream深嵌套。延迟初始化

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:

想象下面的类,代表Vagon:

    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
    引用,则可以将它们作为列表从叶子向上排序
  • 您可以使用
    ommitfield
    来防止XStream序列化上一个/下一个引用,但随后必须单独存储引用(例如映射),并在解组后修复它们。此外,这些引用不会显示在Vagon列表中,因为它们被省略了。您将得到如下结果:

    <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.
    

在这种情况下,它会起作用,但在现实生活中,每个vagon不仅有nextVagon成员,还有以前的vagon链接-因此,如果没有参考,就无法找到一个,将其设置为prime(first)one
<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>