Rick and Werner-
Okay, I found Rick's problem, but this one is a bit interesting.
First, a possible work-around: Rick, you can declare an empty interface
like this:
public interface EmptyInterface {}
And have ThisClass and ThatClass implement said interface. Then if you
modify CallObject to take and return the interface rather than Object,
and modify the mapping file so that type is set to the interface:
<field name="object" type="EmptyInterface">
<bind-xml auto-naming="deriveByClass" />
</field>
Castor will create xml like this:
<?xml version="1.0" encoding="UTF-8"?>
<CallObject>
<ThisClass>
<xx>first</xx>
</ThisClass>
</CallObject>
And it will unmarshall successfully.
Second, why this happens (Werner, you might find this interesting):
Basically with auto-naming, the only way Castor finds a ClassDescriptor
for the auto-named element is through the inheritence search done by
MarshalFramework.searchInheritance. In my test case, I think the search
happens to get lucky because CallObject, ThisClass, and ThatClass are
all in the same package (it may work if they are in different packages,
but I doubt it). The problem before was the fact that Rick's field was
declared as type Object, which searchInheritance specificly outlaws (if
the field type is specified as Object, no class found will be excepted).
With an empty interface, we don't trigger that portion of the logic,
and things go through okay.
Personally, I don't think of auto-naming as a form of inheritence, but I
guess if it is being used then the object being marshalled has to be a
subclass of something. My initial reaction is there should be a
parallel method that searches for matching classes that are auto-named,
since all the required information exists in the mapping file (and this
would get around the problem -- if it exists -- of classes having to be
in the same packages). But now that I've thought about it a little,
some minor modifications to the current searchInheritance might do the
trick, but it will require a code modification.
So Rick, I hope that helps, and Werner, we now know why it was bombing
to begin with.
Thanks,
Stephen
Stephen Bash wrote:
Rick-
Ah... That makes life a little more difficult doesn't it. Yes, with my
solution, the element name will always be callee and the xsi:type will
specify "ThisClass" or "ThatClass". Since you require the element name
to change we'll have to dig a little deeper to find out why the one
solution works while the other doesn't.
Sorry for the confusion, I guess I should have read your first e-mail a
little more carefully. I'll look into it and see what I can find.
Stephen
Fishman, Richard wrote:
Thanks Stephen but, if I understand your solution, it unfortunately
won't work for me in this situation.
If I understand your solution, 'callee' will be the xml tag name, not
ThisClass or ThatClass. Is this correct?
If so, the XML has to have the ThisClass or ThatClass tag name because
the marshalled xml is actually going to another application which
expects that tag name and doesn't use Castor. The issue that I have is
my emulator that I use when testing without the other application. In
that case I am using Castor to unmarshall. So with your suggestion, my
emulator will work fine but the proudction app won't.
If I did not understand your solution correctly, I apologize but could
you elaborate just a bit?
-----Original Message-----
From: Stephen Bash [mailto:[EMAIL PROTECTED] Sent: Wednesday, January
18, 2006 10:16 AM
To: [email protected]
Subject: Re: [castor-user] [XML] Any way to have Castor infer type
from object and serialize it?
Rick-
I was able to reproduce your error, and I agree with Werner, I don't
know why it comes up. But by not using auto-naming, I was able to get
the code to unmarshal successfully (must be a different branch of
logic). So all I changed was the mapping of CallObject:
<class name="CallObject">
<map-to xml="CallObject" />
<field name="object" type="java.lang.Object">
<bind-xml name="callee" />
</field>
</class>
This does mean the xsi:type attribute is required, because otherwise
Castor won't know what class to instantiate.
Hopefully this solution is amenable to your situation.
Stephen
Fishman, Richard wrote:
Werner, I am using packages. These are just examples to make the
testcase understandable.
-----Original Message-----
From: Werner Guttmann [mailto:[EMAIL PROTECTED]
Sent: Wednesday, January 18, 2006 9:45 AM
To: [email protected]
Subject: RE: [castor-user] [XML] Any way to have Castor infer type
from object and serialize it?
Richard,
What surprises me is that the XML as marshalled by Castor still
includes the xsi:type="ThisClass" directive. Apart from that, can you
please consider starting to use packages? Afair, Castor (XML or/and
JDO) uses (used) to have problems with classes in the standard root
package.
Thanks
Werner
-----Original Message-----
From: Fishman, Richard [mailto:[EMAIL PROTECTED]
Sent: Mittwoch, 18. Jänner 2006 15:34
To: [email protected]
Subject: RE: [castor-user] [XML] Any way to have Castor infer type
from object and serialize it?
Yes, this is my mapping xml now:
<class name="CallObject">
<map-to xml="CallObject" />
<field name="object" type="java.lang.Object">
<bind-xml auto-naming="deriveByClass" />
</field>
</class>
<class name="ThisClass">
<map-to xml="ThisClass"/>
<field name="xx" type="java.lang.String">
<bind-xml name="xx" node="element"/>
</field>
</class>
<class name="ThatClass">
<map-to xml="ThatClass"/>
<field name="yy" type="java.lang.String">
<bind-xml name="yy" node="element"/>
</field>
</class>
The XML that was marshalled (and is attempted to be
unmarshalled) looks like this:
<CallObject><ThisClass
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="ThisClass"><xx>something</xx></ThisClass></CallObject>
-----Original Message-----
From: Stephen Bash [mailto:[EMAIL PROTECTED]
Sent: Wednesday, January 18, 2006 9:26 AM
To: [email protected]
Subject: Re: [castor-user] [XML] Any way to have Castor infer type
from object and serialize it?
Rick-
Does ThisClass have a mapping anywhere that Castor knows about?
That would give Castor a hard reference between the element name and
the fully qualified class name which might help.
Stephen
Fishman, Richard wrote:
Thanks! That works great for marshalling the XML.
Unmarshalling is getting an error though:
org.xml.sax.SAXException: unable to find FieldDescriptor for
'ThisClass' in ClassDescriptor of CallObject at
org.exolab.castor.xml.UnmarshalHandler.startElement(UnmarshalHandler.j
ava:1933) at
org.exolab.castor.xml.UnmarshalHandler.startElement(UnmarshalHandler.j
ava:1381) at
org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown
Source)
Any ideas?
-----Original Message-----
From: Werner Guttmann [mailto:[EMAIL PROTECTED]
Sent: Wednesday, January 18, 2006 8:49 AM
To: [email protected]
Subject: RE: [castor-user] [XML] Any way to have Castor
infer type from object and serialize it?
Hi,
A field mapping similar to
<field name="object" type="java.lang.Object"
collection="collection">
<bind-xml auto-naming="deriveByClass"></bind-xml>
</field>
should do the trick in your case. Have a look at
http://castor.codehaus.org/xml-mapping.html#5.-xsi:type for more
details.
Regards
Werner
-----Original Message-----
From: Fishman, Richard [mailto:[EMAIL PROTECTED]
Sent: Mittwoch, 18. Jänner 2006 14:44
To: [email protected]
Subject: [castor-user] [XML] Any way to have Castor infer type
from object and serialize it?
We have a class called CallObject and it contains one
member variable
whose type can change. We want to be able to have The CallObject
contain an Object and have Castor serialize it
appropriately based on
the class of the object.
In other words, we want a class like this:
Public class CallObject
{
private Object theObj;
public void setObject(Object o)
{
this.theObj = 0;
}
}
Then clients would call setObject with whatever they want in that
'call object'. For example:
callObj.setObject(new ThisClass());
Or
callObj.setObject(new ThatClass());
The mapping.xml would have rules for CallObject as well as
ThisClass
and
ThatClass:
<class name="CallObject">
<map-to xml="CallObject"/>
</class>
<class name="ThisClass">
<map-to xml="ThisClass"/>
<field name="xx" type="java.lang.String">
<bind-xml name="xx" node="element"/>
</field>
</class>
<class name="ThatClass">
<map-to xml="ThatClass"/>
<field name="yy" type="java.lang.String">
<bind-xml name="yy" node="element"/>
</field>
</class>
Then depending on what was set into callObj, the
appropriate XML would
be generated, either:
<CallObject>
<ThisClass>
<xx>something</xx>
</ThisClass>
</CallObject>
Or
<CallObject>
<ThatClass>
<yy>somethingElse</yy>
</ThatClass>
</CallObject>
Is this possible to do? If so, how do you do it?
Blue Cross Blue Shield of Florida, Inc., and its subsidiary and
affiliate companies are not responsible for errors or omissions in
this e-mail message. Any personal comments made in this
e-mail do not
reflect the views of Blue Cross Blue Shield of Florida, Inc. The
information contained in this document may be confidential and
intended solely for the use of the individual or entity to
whom it is
addressed. This document may contain material that is
privileged or
protected from disclosure under applicable law. If you are not
the intended recipient or the individual responsible for
delivering to the
intended recipient, please (1) be advised that any use,
dissemination,
forwarding, or copying of this document IS STRICTLY PROHIBITED; and
(2) notify sender immediately by telephone and destroy the
document.
THANK YOU.
-------------------------------------------------
If you wish to unsubscribe from this list, please send an empty
message to the following address:
[EMAIL PROTECTED]
-------------------------------------------------
-------------------------------------------------
If you wish to unsubscribe from this list, please send an empty
message to the following address:
[EMAIL PROTECTED]
-------------------------------------------------
Blue Cross Blue Shield of Florida, Inc., and its subsidiary
and affiliate companies are not responsible for errors or omissions
in this e-mail message. Any personal comments made in this e-mail do
not reflect the views of Blue Cross Blue Shield of Florida, Inc.
The information contained in this document may be confidential and
intended solely for the use of the individual or entity to whom it
is addressed. This document may contain material that is privileged
or protected from disclosure under applicable law. If you are not
the intended recipient or the individual responsible for delivering
to the intended recipient, please (1) be advised that any use,
dissemination, forwarding, or copying of this document IS STRICTLY
PROHIBITED; and
(2) notify sender immediately by telephone and destroy the document.
THANK YOU.
-------------------------------------------------
If you wish to unsubscribe from this list, please send an empty
message to the following address:
[EMAIL PROTECTED]
-------------------------------------------------
-------------------------------------------------
If you wish to unsubscribe from this list, please send an empty
message to the following address:
[EMAIL PROTECTED]
-------------------------------------------------
Blue Cross Blue Shield of Florida, Inc., and its subsidiary and
affiliate companies are not responsible for errors or omissions in
this e-mail message. Any personal comments made in this e-mail do
not reflect the views of Blue Cross Blue Shield of Florida, Inc.
The information contained in this document may be confidential and
intended solely for the use of the individual or entity to whom it
is addressed. This document may contain material that is privileged
or protected from disclosure under applicable law. If you are not
the intended recipient or the individual responsible for delivering
to the intended recipient, please (1) be advised that any use,
dissemination, forwarding, or copying of this document IS STRICTLY
PROHIBITED; and
(2) notify sender immediately by telephone and destroy the document.
THANK YOU.
-------------------------------------------------
If you wish to unsubscribe from this list, please send an empty
message to the following address:
[EMAIL PROTECTED]
-------------------------------------------------
-------------------------------------------------
If you wish to unsubscribe from this list, please send an empty
message to the following address:
[EMAIL PROTECTED]
-------------------------------------------------
Blue Cross Blue Shield of Florida, Inc., and its subsidiary and
affiliate companies are not responsible for errors or omissions in
this e-mail message. Any personal comments made in this e-mail do not
reflect the views of Blue Cross Blue Shield of Florida, Inc. The
information contained in this document may be confidential and
intended solely for the use of the individual or entity to whom it is
addressed. This document may contain material that is privileged or
protected from disclosure under applicable law. If you are not the
intended recipient or the individual responsible for delivering to
the intended recipient, please (1) be advised that any use,
dissemination, forwarding, or copying of this document IS STRICTLY
PROHIBITED; and (2) notify sender immediately by telephone and
destroy the document. THANK YOU.
-------------------------------------------------
If you wish to unsubscribe from this list, please send an empty
message to the following address:
[EMAIL PROTECTED]
-------------------------------------------------
-------------------------------------------------
If you wish to unsubscribe from this list, please send an empty
message to the following address:
[EMAIL PROTECTED]
-------------------------------------------------
Blue Cross Blue Shield of Florida, Inc., and its subsidiary and
affiliate companies are not responsible for errors or omissions in
this e-mail message. Any personal comments made in this e-mail do not
reflect the views of Blue Cross Blue Shield of Florida, Inc. The
information contained in this document may be confidential and
intended solely for the use of the individual or entity to whom it is
addressed. This document may contain material that is privileged or
protected from disclosure under applicable law. If you are not the
intended recipient or the individual responsible for delivering to the
intended recipient, please (1) be advised that any use, dissemination,
forwarding, or copying of this document IS STRICTLY PROHIBITED; and
(2) notify sender immediately by telephone and destroy the document.
THANK YOU.
-------------------------------------------------
If you wish to unsubscribe from this list, please send an empty
message to the following address:
[EMAIL PROTECTED]
-------------------------------------------------
-------------------------------------------------
If you wish to unsubscribe from this list, please send an empty message
to the following address:
[EMAIL PROTECTED]
-------------------------------------------------
-------------------------------------------------
If you wish to unsubscribe from this list, please
send an empty message to the following address:
[EMAIL PROTECTED]
-------------------------------------------------