Then if I understand you correctly, you want to serialize each SourceVO 
instance only the first time it's seen, and if it's later referenced 
again just refer back to the already-serialized copy. Handling this 
automatically was something I'd originally intended for JiBX, but I 
found it was an uncommon requirement and I've never been motivated to 
make it work. You can still do it using custom 
marshalling/unmarshalling, though it's somewhat involved.

The basic idea is to define an abstract <mapping> for SourceVO with a 
type-name, and specify force-classes="true" on the <binding> element. 
Then your code can find the index number assigned to the generated 
marshaller/unmarshaller (what I'll call a "handler") using the 
getTypeIndex() call of the IBindingFactory instance.

You can track which instances have already been marshalled in your 
custom marshaller code. When told to marshal an instance, if it hasn't 
previously been marshalled you'd just record the id value and write the 
start tag, then delegate to the generated marshaller for the bulk of the 
processing, and finish by writing the end tag. If it *has* previously 
been marshalled, you'd instead write and empty tag with a single 
attribute (say ref="id") that identifies the instance.

Unmarshalling is similar. If the element you're called on has the 
ref="id" attribute you just look up the previously-unmarshalled instance 
using the id. If the element doesn't have the ref="id" attribute you use 
the normal unmarshalling, but record the result in a hashmap.

Hope that gets you started...

  - Dennis

Dennis M. Sosnoski
SOA and Web Services in Java
Training and Consulting
http://www.sosnoski.com - http://www.sosnoski.co.nz
Seattle, WA +1-425-939-0576 - Wellington, NZ +64-4-298-6117



Johannes Müller wrote:
> Hello Dennis,
>
> thanks for your reply.
>
> If I understand you correctly, this would mean that there had to be a finite 
> set of possible SourceVO structures that are known in advance to implement 
> this.
>
> But the set of possible SourceVO-structures is infinite and not known in 
> advance.
>
> If you imagine the recursive List<SourceVO> structure as a tree, then all 
> possible trees shall be mapped from and to XML, a flat tree consisting of one 
> root element with 128 direct child-SourceVO's just as well as a highly 
> complex tree with thousands of SourceVO-nodes and dozens of levels, with 
> every single SourceVO having different amounts of child-SourceVOs, for 
> instance.
>
> Is this possible with JiBX?
>
> Regards,
>
> Johannes
>
>
>
>
> -------- Original-Nachricht --------
> Datum: Mon, 05 Mar 2007 19:23:19 +1300
> Von: Dennis Sosnoski <[EMAIL PROTECTED]>
> An: JiBX users <[email protected]>
> CC: 
> Betreff: Re: [jibx-users] Handling recursive collections: How?
>
>   
>> Hi Johannes,
>>
>> The only way of handling this type of situation is to have a collection 
>> of all the SourceVO instances at one point in your binding, then use 
>> ID/IDREF links to refer to each instance. So it'd end up looking 
>> something like this:
>>
>>   <SourceVO id="ID8">
>>     ...
>>     <sources>ID1 ID3 ID10 ...</source>
>>     ...
>>   </SourceVO>
>>   <SourceVO id="ID10">
>>     ...
>>   </SourceVO>
>>
>> See the Working with IDs section of the tutorial 
>> (http://jibx.sourceforge.net/tutorial/binding-collects.html#ids) for 
>> some details on how to handle this in the binding. Note that you'd 
>> probably have to use some extension code of your own to convert the 
>> SourceVOs into this type of structure - you'd basically want to build a 
>> collection of the closure of all the SourceVOs being marshalled in your 
>> own code, then have JiBX marshal the constructed collection.
>>
>>   - Dennis
>>
>> Dennis M. Sosnoski
>> SOA and Web Services in Java
>> Training and Consulting
>> http://www.sosnoski.com - http://www.sosnoski.co.nz
>> Seattle, WA +1-425-939-0576 - Wellington, NZ +64-4-298-6117
>>
>>
>>
>> Johannes Müller wrote:
>>     
>>> Hello all,
>>>
>>> in a Java object called "SourceVO", I have an attribute called
>>>       
>> "sources", which is a list of "SourceVO"'s. Therefore, each of the list 
>> objects
>> contains a list of SourceVO's itself (recursion).
>>     
>>> I tried to bind this with the following JiBX mappings, but with these,
>>>       
>> the binding compiler (v1.1.3) runs into an endless loop.
>>     
>>> How can I get the recursive collections bound properly?
>>>
>>> <mapping [...]>
>>>   [...]
>>>   <collection field="sources"
>>>       
>> factory="org.foobar.JiBXHelper.sourceVOListFactory" usage="optional">
>>     
>>>     <structure name="source"  map-as="org.foobar.SourceVO" />
>>>   </collection> 
>>>   [...]
>>> </mapping>   
>>>
>>>
>>> <mapping class="org.foobar.SourceVO" ordered="false"
>>>       
>> allow-repeats="true" abstract="true">                 
>>     
>>>    [...]                                                            
>>>    <collection field="sources"
>>>       
>> factory="org.foobar.JiBXHelper.sourceVOListFactory" usage="optional">
>>     
>>>       <structure name="source" map-as="org.foobar.SourceVO" />
>>>       
>> </collection>                                                                
>>  [...]
>>     
>>> </mapping>
>>>
>>> Regards,
>>>
>>> Johannes
>>>
>>>
>>>       
>> -------------------------------------------------------------------------
>>     
>>> Take Surveys. Earn Cash. Influence the Future of IT
>>> Join SourceForge.net's Techsay panel and you'll get the chance to share
>>>       
>> your
>>     
>>> opinions on IT & business topics through brief surveys-and earn cash
>>>
>>>       
>> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
>>     
>>> _______________________________________________
>>> jibx-users mailing list
>>> [email protected]
>>> https://lists.sourceforge.net/lists/listinfo/jibx-users
>>>
>>>   
>>>       
>> -------------------------------------------------------------------------
>> Take Surveys. Earn Cash. Influence the Future of IT
>> Join SourceForge.net's Techsay panel and you'll get the chance to share
>> your
>> opinions on IT & business topics through brief surveys-and earn cash
>> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
>> _______________________________________________
>> jibx-users mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/jibx-users
>>     
>
>   

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
jibx-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jibx-users

Reply via email to