Stefan,

Why not try the following:


         <class name="SpecBench.CoreData.CategoriesRepository">
               <field name="uniqueId" type="int" direct="true">
                 <bind-xml name="unique-id" node="attribute"/>
               </field>
               <!-- Big array again, note that i DON'T use reference -->
               <field name="data"  collection="vector" direct="true">
                     <bind-xml name="data" node="element"/>
               </field>
         </class>

Basically, don't map the "root" node since it'll already be handled when
the vector is marshalled.

--Keith

Stefan Champailler wrote:
> 
> > Stefan,
> >
> > Can you provide a small example (the smaller the better) which would
> > demonstrate the problem?
> 
> Yes of course !
> 
> This is the working mapping (it's not much commented yet, if you need that for
> understanding, I'll do) :
> 
>         <class name="SpecBench.CoreData.CategoriesRepository">
>             <field name="uniqueId" type="int" direct="true">
>                 <bind-xml name="unique-id" node="attribute"/>
>             </field>
> 
>               <!-- This is the "big array" I talk about. Note I use reference
> here -->
> 
>               <field name="data" collection="vector" direct="true">
>                     <bind-xml name="data" reference="true" node="element"/>
>               </field>
> 
>               <!-- This allows castor to store the tree -->
> 
>               <field name="root" type="SpecBench.CoreData.Category">
>                     <bind-xml name="root" node="element"/>
>               </field>
>         </class>
> 
>         <class name="SpecBench.CoreData.Category" identity="repositoryId">
> 
>               <field name="name" type="string">
>                     <bind-xml name="name" node="attribute"/>
>               </field>
> 
>               <field name="children" type="SpecBench.CoreData.Category"
>                      collection="vector" get-method="castorGetChildren"
>                      set-method="castorSetChildren">
>                       <bind-xml name="children" node="element"/>
>               </field>
> 
>               <field name="parent" type="SpecBench.CoreData.Category">
>                 <bind-xml name="parent" reference="true" node="attribute"/>
>               </field>
> 
>               <!-- Some other simple fields... I don't think these have any
> influence -->
>               &repositoryItemsFields;
>         </class>
> 
> -------------------------------------------------------------------------
> And now, the mapping that doesn't work :
> 
>         <class name="SpecBench.CoreData.CategoriesRepository">
>             <field name="uniqueId" type="int" direct="true">
>                 <bind-xml name="unique-id" node="attribute"/>
>             </field>
> 
>               <!-- Big array again, note that i DON'T use reference -->
>               <field name="data"  collection="vector" direct="true">
>                     <bind-xml name="data" node="element"/>
>               </field>
> 
>               <field name="root" type="SpecBench.CoreData.Category">
>                     <bind-xml name="root" reference="true" node="attribute"/>
>               </field>
>         </class>
> 
>         <class name="SpecBench.CoreData.Category" identity="repositoryId">
>               &repositoryItemsFields;
> 
>               <field name="name" type="string">
>                     <bind-xml name="name" node="attribute"/>
>               </field>
> 
>               <field name="children" type="SpecBench.CoreData.Category"
> collection="vector">
>                       <bind-xml name="children" reference="true"
> node="element"/>
>               </field>
> 
>               <field name="parent" type="SpecBench.CoreData.Category">
>                       <bind-xml name="parent" reference="true"
> node="attribute"/>
>               </field>
> 
>         </class>
> 
> have a good read !
> 
> Stefan
> 
> >
> > Thanks,
> >
> > --Keith
> >
> > Stefan Champailler wrote:
> > > Dear all,
> > >
> > > I've been using Castor-XML for several month now and I'm happy with it.
> > > However,...
> > >
> > > It seems that the order of an array or vector is not preserved in case
> > > that array is told to be stored using reference="true" in the bind-xml
> > > element. For example, my situation is like this : I have a tree. Each
> > > node of the tree contains a vector of children (standard stuff). However,
> > > I have a "big" array in which I put a reference to all the nodes of the
> > > tree. Therefore, I have two ways to run the tree : by doing a standard,
> > > recursive tree run on each nodes or by looking at the nodes as they are
> > > listed in the "big" array. Now, when I store the elements in XML with
> > > Castor, I instruct it to store the "big" array, not the elements as a
> > > tree-structure (this makes a cleaner XML). Therefore, it stores all the
> > > nodes, one by one, ordered as in the big array. Each node's child is
> > > represented as a reference (using <bind-xml reference="true"...)
> > > Unfortunately, when I do that, Castor looses the order of the elements in
> > > each of the vector of children. However, the resulting order is not
> > > random, it strictly follows the order in which the nodes appears in the
> > > "big" array.  So, whatever the order of the children of any node,
> > > everything gets reordered according to the big array's order.
> > >
> > > As a fix, I have told Castor to store the node of the tree recursively,
> > > without reference, and after that, to store the "big" array with
> > > references to the nodes. Working this way brings the result I expected
> > > (however information is duplicated).
> > >
> > > I checked the bug reports and it seems there are some issues with
> > > ordering, but I don't feel I'm connected to those issues. Moreover, I
> > > noticed that nowhere in the documentation it is said that the order is
> > > preserved, so maybe it's just a feature :)
> > >
> > > Thank you for any help.
> > >
> > > stF
> > >
> > > -----------------------------------------------------------
> > > If you wish to unsubscribe from this mailing, send mail to
> > > [EMAIL PROTECTED] with a subject of:
> > >         unsubscribe castor-user
> >
> > -----------------------------------------------------------
> > If you wish to unsubscribe from this mailing, send mail to
> > [EMAIL PROTECTED] with a subject of:
> >         unsubscribe castor-user
> 
> -----------------------------------------------------------
> If you wish to unsubscribe from this mailing, send mail to
> [EMAIL PROTECTED] with a subject of:
>         unsubscribe castor-user



----------------------------------------------------------- 
If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
        unsubscribe castor-user

Reply via email to