Stephen, you are THE MAN!

Actually, since all the objects passed in need to be Serializable anyway, I 
just specified Serializable instead of Object and that worked. Gets rid of 
xsi:type too!

Thanks again to all. 

-----Original Message-----
From: Stephen Bash [mailto:[EMAIL PROTECTED] 
Sent: Wednesday, January 18, 2006 11:18 AM
To: [email protected]
Subject: Re: [castor-user] [XML] Any way to have Castor infer type from object 
and serialize it?

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(UnmarshalHandle
>>>> r.j
>>>>
>>>>
>>>>> ava:1933) at
>>>>>
>>>>
>>>> org.exolab.castor.xml.UnmarshalHandler.startElement(UnmarshalHandle
>>>> r.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]
-------------------------------------------------







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]
-------------------------------------------------

Reply via email to