Re: How to send up a multi-dimensional array in a property of type system.object?
- From: "John Saunders [MVP]" <john.saunders at trizetto.com>
- Date: Thu, 19 Jul 2007 15:46:26 -0400
<psm@xxxxxxxxxx> wrote in message news:1184858454.441522.70840@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
I have a web service that returns Field[][]. The Field object contains
Name (type string) and Val (type object).
I am using it to return back a user-defined selection of properties of
an task object, hence Val being of type object.
This web service works fine, until I try to put another Field[][]
(containing an array of historical values of the task object) in to
the Val of one field, and then I get a SOAP Exception:
Unable to cast object of type Field[][] to Field[]
I have to say that I'm struggling to understand the error. I know that
the web service can return Field[][] at the top level, so I don't
understand why it can't cope with it further down the object hierachy
I've tried all manner of XML serialization attributes, and nothing
makes a difference.
Any suggestions, other than wrapping the second Field[][] in another
class, which I'd rather not do, as the historical task data is in the
same format as the current task data, so it doesn't seem to make sense
to have different objects for them?
It's really amazing that this works at all.
Consider that you're serializing your objects into XML for some other piece of code to deserialize. You aren't giving that client code much information about what you're sending. Have you looked at the generated WSDL? The Val field is declared:
<s:element minOccurs="0" maxOccurs="1" name="Val" />
This only works at all because the type information will be included in the XML for the primitive types:
<Val xsi:type="xsd:dateTime">2007-07-19T15:39:52.4875-04:00</Val>
Which xsi:type should it use for Field[][]?
BTW, it _does_ work if you wrap the Field[][]. Furthermore, if you don't want the two to be different, then you should always use the wrapped version. Have your webmethod return WrappedArrayOfArrayOfField. That will return something like this:
<Val xsi:type="FieldWrapper">
<Wrapped>
<ArrayOfField>
<Field>
<Name>name1</Name>
<Val xsi:type="xsd:int">1</Val>
</Field>
<Field>
<Name>name2</Name>
<Val xsi:type="xsd:string">abc</Val>
</Field>
</ArrayOfField>
...
--
John Saunders [MVP]
.
- Follow-Ups:
- References:
- Prev by Date: Re: rising process time of a webservice
- Next by Date: Re: rising process time of a webservice
- Previous by thread: How to send up a multi-dimensional array in a property of type system.object?
- Next by thread: Re: How to send up a multi-dimensional array in a property of type system.object?
- Index(es):
Loading