David,
You cannot send an element of an abstract type. Your choices:
- don't send the <Address/> element (requires minOccurs="0")
- define it as a concrete type
Anne
On 3/1/07, David Elliott <[EMAIL PROTECTED]> wrote:
I am testing some interoperability between a Java Client using Axis and
a .NET ASMX Webservice and am experiencing a problem and was wondering
if anyone has an idea of what is going on.
If I have a class that contains a data member that is abstract and try to
pass a
derived class type into the webservice, an XML error is generated. If I
receive the
same exact structure from the webservice all works as expected.
I have a full .NET webservice and java client that will demonstrate the
issue if
anyone wants the code.
I am including the soap messages that are received on the service.
The class definition follows the SOAP Messages.
Thanks,
Dave
WebbertSolutions[at]hotmail[dot]com
Good Message
- don't send address in
- receive address
==============================
----- SoapRequest at 2/27/2007 2:01:41 PM -----
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<GetAdmin xmlns="urn:emp:service">
<ns1:person xmlns:ns1="urn:emp:data">
<ns1:Name>Hello World</ns1:Name>
<ns1:Age>12</ns1:Age>
</ns1:person>
</GetAdmin>
</soapenv:Body>
</soapenv:Envelope>
----- SoapResponse at 2/27/2007 2:01:41 PM -----
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetAdminResponse xmlns="urn:emp:service">
<GetAdminResult xsi:type="Admin" xmlns="urn:emp:data">
<Name>Hello World</Name>
<Age>12</Age>
<Address xsi:type="HomeAddress">
<HouseNumber>234 State Street</HouseNumber>
</Address>
<HasPassword>true</HasPassword>
</GetAdminResult>
</GetAdminResponse>
</soap:Body>
</soap:Envelope>
Bad Message
- populate HomeAddress
- send HomeAddress in
==============================
----- SoapRequest at 2/27/2007 2:01:13 PM -----
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<GetAdmin xmlns="urn:emp:service">
<ns1:person xmlns:ns1="urn:emp:data">
<ns1:Name>Hello World</ns1:Name>
<ns1:Age>12</ns1:Age>
<ns1:Address />
</ns1:person>
</GetAdmin>
</soapenv:Body>
</soapenv:Envelope>
----- SoapResponse at 2/27/2007 2:01:13 PM -----
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>System.Web.Services.Protocols.SoapException:
Server was unable to read request. --->
System.InvalidOperationException: There is an error in XML
document (1, 353). ---> System.InvalidOperationException:
The specified type is abstract: name='Address', namespace='urn:emp:data', at
<Address xmlns='urn:emp:data'>.
at
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read5_Address(Boolean
isNullable, Boolean checkType)
at
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read6_Person(Boolean
isNullable, Boolean checkType)
at
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read7_GetAdmin()
at
Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer.Deserialize(XmlSerializationReader
reader)
at
System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader
xmlReader, String encodingStyle, XmlDeserializationEvents events)
--- End of inner exception stack trace ---
at
System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader
xmlReader, String encodingStyle, XmlDeserializationEvents events)
at
System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader
xmlReader, String encodingStyle)
at
System.Web.Services.Protocols.SoapServerProtocol.ReadParameters()
--- End of inner exception stack trace ---
at
System.Web.Services.Protocols.SoapServerProtocol.ReadParameters()
at
System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()</faultstring>
<detail />
</soap:Fault>
</soap:Body>
</soap:Envelope>
public abstract class PersonBase
{
protected PersonBase() { }
private string _name;
public string Name
{
get { return ( _name ); }
set { _name = value; }
}
}
public class Person : PersonBase
{
private int _age;
private Address _address;
public int Age
{
get { return ( _age ); }
set { _age = value; }
}
public Address Address
{
get { return ( _address ); }
set { _address = value; }
}
}
public abstract class Address
{
protected Address() { }
}
public class HomeAddress : Address
{
public HomeAddress() { }
private string _houseNumber;
public string HouseNumber
{
get { return ( _houseNumber ); }
set { _houseNumber = value; }
}
}
________________________________
Explore the seven wonders of the world Learn more!
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]