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]

Reply via email to