question about deep nesting

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

question about deep nesting

Юркин Павел
Hello, guys. I have ecountered a problem about xStream that forced me to ask some guidence.

Imagine the following class, representing the Vagon:

        class Vagon {
                int id;
                Vagon nextVagon;
        }

it has only two fields: an id and reference to next class instance.
So, imagine we have list of this objects representing train:

                Vagon vagon5 = new Vagon( 5, null );
                Vagon vagon4 = new Vagon( 4, vagon5 );
                Vagon vagon3 = new Vagon( 3, vagon4 );
                Vagon vagon2 = new Vagon( 2, vagon3 );
                Vagon vagon1 = new Vagon( 1, vagon2 );
                Vagon vagon0 = new Vagon( 0, vagon1 );

where the vagon0 - is the last, next to him vagon1 and so on.
So, when i serialise List of this vagons using xstream i got smth like this:

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

So IN fact - I have first big vagon0 that includes within itself  all other vagons, and the other list members - are refereces.

The problems are
1) if list size is very big xStream can't serialize it due to stack limiting - i'm just getting StackOverflow Error.
2) Output is very hard to read: i would like having smthing like that:

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

So, from tech point of view, I think that we are speaking of lazy marshalling - first marsal vagons leaving the "nextVagon" blank - and then when we will have all train in memory insert the refereces.
Is there any way to do this in xStream or i will have to write my own Converter to TrainList?

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply | Threaded
Open this post in threaded view
|

Re: question about deep nesting

Jörg Schaible-2
Hi,

sorray for the delay, but you're on the wrong list. Anyway, ...

Юркин Павел wrote:

> Hello, guys. I have ecountered a problem about xStream that forced me to
> ask some guidence.
>
> Imagine the following class, representing the Vagon:
>
>         class Vagon {
> int id;
> Vagon nextVagon;
> }
>
> it has only two fields: an id and reference to next class instance.
> So, imagine we have list of this objects representing train:
>
>                 Vagon vagon5 = new Vagon( 5, null );
> Vagon vagon4 = new Vagon( 4, vagon5 );
> Vagon vagon3 = new Vagon( 3, vagon4 );
> Vagon vagon2 = new Vagon( 2, vagon3 );
> Vagon vagon1 = new Vagon( 1, vagon2 );
> Vagon vagon0 = new Vagon( 0, vagon1 );
>
> where the vagon0 - is the last, next to him vagon1 and so on.
> So, when i serialise List of this vagons using xstream i got smth like
> this:
>
> <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>
>
> So IN fact - I have first big vagon0 that includes within itself  all
> other vagons, and the other list members - are refereces.
>
> The problems are
> 1) if list size is very big xStream can't serialize it due to stack
> limiting - i'm just getting StackOverflow Error. 2) Output is very hard to
> read: i would like having smthing like that:
>
> <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>
>
> So, from tech point of view, I think that we are speaking of lazy
> marshalling - first marsal vagons leaving the "nextVagon" blank - and then
> when we will have all train in memory insert the refereces. Is there any
> way to do this in xStream or i will have to write my own Converter to
> TrainList?

You simply cannot. XStream is based on a stream model i.e. you can neither
reference something that is marshalled in future nor can you unmarshal an
incomplete object. Even with an own converter (note, you have to ensure
thread-safety yourself in this case, because it has state), you have the
problem at unmarshalling time. Your converter should return an object that
is not complete.

BTW: How deep are you nested if you run into a StackOverflow? I cannot
imagine this to happen without a major error in a custom converter ...

Cheers,
Jörg




---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email