Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > ASP .Net > ASP .Net Web Services > How to send up a multi-dimensional array in a property of type system.object?

Reply
Thread Tools

How to send up a multi-dimensional array in a property of type system.object?

 
 
psm@delcam.com
Guest
Posts: n/a
 
      07-19-2007
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?

Cheers,

Paul

 
Reply With Quote
 
 
 
 
John Saunders [MVP]
Guest
Posts: n/a
 
      07-19-2007
<(E-Mail Removed)> wrote in message
news:(E-Mail Removed) ups.com...
>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]

 
Reply With Quote
 
 
 
 
psm@delcam.com
Guest
Posts: n/a
 
      07-23-2007
On Jul 19, 8:46 pm, "John Saunders [MVP]" <john.saunders at
trizetto.com> wrote:
> <(E-Mail Removed)> wrote in message
>
> news:(E-Mail Removed) ups.com...
>
> 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>
> ...


That's the part that I don't get; I have looked at the WSDL (far too
many times!), and I can see the overall result node:

<s:element name="GetTasksResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1"
name="GetTasksResult"
type="tns:ArrayOfArrayOfField" />
</s:sequence>
</s:complexType>
</s:element>

So, in answer to your question:

> Which xsi:type should it use for Field[][]?


I would have thought tns:ArrayOfArrayOfField would be the type it
would serialize as. There is a node with that name in the WSDL
already, so I don't understand why it can't utilise that?

I've tried putting a string[][] into Val, and that blows up too, so it
seems that it's just a problem putting a multi-dimensional (well,
jagged) array into the Val.

In fact, we just tried returning a jagged array from a web method that
returns one System.object, tried returning string[][], and that
doesn't work either, so that seems to confirm that you just can't
return a jagged array as System.object. I'm intrigued as to why that
is the case though.

Cheers,

Paul

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
Could not find a property named '... ' on the type specified by the DataObjectTypeName property in ObjectDataSource '...' Anabela Silva ASP .Net 0 11-01-2006 07:08 PM
Custom Attributes (AttributeTargets.Property) and Property Type Zarko Gajic ASP .Net Building Controls 0 04-07-2005 02:20 PM
Re: Type casting- a larger type to a smaller type heyo C Programming 3 04-01-2004 06:35 PM
HowTo Send Uploaded File with INPUT Type file to Sql Server Image Data Type Roberto ASP General 3 10-18-2003 06:56 AM



Advertisments