Hi Paul,

The problem with your binding lies, as you suspected, in trying to use the same name for both the base class and the subclass. This is a case I should probably check, since there's no way to handle it for unmarshalling.

The class you pass to the getFactory() method doesn't matter, because that's only used to find the binding information, and if both these definitions are in the same binding there's no way to control which one would actually be used for unmarshalling.

That said, the case you're actually interested in - where a bound class has subclasses, and you want to handle the subclasses using the base class binding - should work fine for marshalling. For unmarshalling the situation is a little trickier, since there's in general no way for JiBX to know that you actually want to use a subclass rather than the base class. If you use a factory-method you can control the actual subclass created for an unmarshalled object, so that's one way to handle this side of things. Another is for the constructor of the containing object to just create an instance of the appropriate subclass (or do the same thing with a preset-method), assuming the containing object knows which variation of your subclassed type is appropriate - JiBX will use an already-created object instance for unmarshalling, in preference to creating a new instance.

 - Dennis

Chisholm, Paul wrote:

Hi,

I have an issue with binding and class inheritance. Take the classes

public class A
{
   private int a;
}

public class B extends A
{
   int b;
}

and the binding file

<binding>
 <mapping name="data" class="A">
     <value name="a" field="a"/>
 </mapping>
 <mapping name="data" class="B" extends="A">
   <structure map-as="A"/>
 </mapping>
</binding>

- The mapping for A isn't abstract because I need to create concrete
instances of both A and B.
- Class B adds data when extending A but this data does not play any
part in marshalling/unmarshalling.
- The top level element for both A and B is 'data'.

Now I unmarshal the XML

<?xml version=\"1.0\" encoding=\"UTF-8\"?><data><a>24</a></data>

when I pass A.class to the getFactory method in preparation for
unmarshalling, all works as expected. When I pass B.class to the
getFactory method in preparation for unmarshalling, the unmarshalling
method returns an object of class A (not class B).

This does not seem correct. I'm not sure if giving two mappings the same
name is allowed. In the real situation I derived this example from I
need to use the same top level element. Anyone have any idea what is
going on, or what I am doing wrong?

The above was my attempt to get round a limitation with inheritance.
Namely, if class B extends class A, and I have a defined binding for
class A, then I want to be able to marshal/unmarshal objects of class B
implicitly. That is, when I marshal B the run-time would look at class
B, see it doesn't have any binding information, but notice superclass A
does so just use A. I am not familiar with the inner workings of JiBX so
that may be a big ask. Is it a feasible extension?

Thanks,
Paul


-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_idv37&alloc_id865&opÌk
_______________________________________________
jibx-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jibx-users




-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_idv37&alloc_id865&op=click
_______________________________________________
jibx-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jibx-users

Reply via email to