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