I am consuming a web service and using the generated Reference.cs to access
the service and the objects associated with it.
I have run into a problem where some inherited classes are not being
deserialized. I have verified that the XML being returned by the service
contains the tags I am expecting, but they don't show up in the resulting
object. Here's the relevant portion of the Reference.cs file:
[System.Xml.Serialization.XmlTypeAttribute(Namespac e="http://mywebservice.com/1.0")]
public class FormSection {
[System.Xml.Serialization.XmlElementAttribute("fiel d")]
public FormField[] field;
}
[System.Xml.Serialization.XmlTypeAttribute(Namespac e="http://mywebservice.com/1.0")]
[System.Xml.Serialization.XmlIncludeAttribute(typeo f(SelectOneField))]
[System.Xml.Serialization.XmlIncludeAttribute(typeo f(SelectMultipleField))]
[System.Xml.Serialization.XmlIncludeAttribute(typeo f(BooleanField))]
public class FormField {
[System.Xml.Serialization.XmlElementAttribute("valu e")]
public string[] value;
[System.Xml.Serialization.XmlAttributeAttribute()]
public FormFieldType type;
}
[System.Xml.Serialization.XmlTypeAttribute(Namespac e="http://mywebservice.com/1.0")]
public enum FormFieldType {
boolean,
select1,
selectn,
}
[System.Xml.Serialization.XmlTypeAttribute(Namespac e="http://mywebservice.com/1.0")]
[System.Xml.Serialization.XmlIncludeAttribute(typeo f(SelectMultipleField))]
public class SelectOneField : FormField {
[System.Xml.Serialization.XmlArrayItemAttribute("ch oice")]
public Choice[] choices;
}
[System.Xml.Serialization.XmlTypeAttribute(Namespac e="http://mywebservice.com/1.0")]
public class Choice {
public string value;
[System.Xml.Serialization.XmlArrayItemAttribute("fi eld")]
public FormField[] fields;
}
[System.Xml.Serialization.XmlTypeAttribute(Namespac e="http://mywebservice.com/1.0")]
public class SelectMultipleField : SelectOneField {
[System.Xml.Serialization.XmlAttributeAttribute()]
public int maximum_choices;
[System.Xml.Serialization.XmlAttributeAttribute()]
public int minimum_choices;
}
[System.Xml.Serialization.XmlTypeAttribute(Namespac e="http://mywebservice.com/1.0")]
public class BooleanField : FormField {
[System.Xml.Serialization.XmlArrayItemAttribute("fi eld")]
public FormField[] fields;
}
The problem occurs when I get XML like this:
<field type="select1">
<value/>
<choices>
<choice>
<value>17</value>
<fields>
</fields>
</choice>
<choice>
<value>18</value>
<fields>
</fields>
</choice>
</choices>
When this is deserialized, there are no choices! And in code, if I try to
cast
to one of the inherited types, I get an error. Here's the snippet of code:
FormField field = <stuff>.field[0];
switch (field.type)
{
case FormFieldType.boolean:
string[] boolean_value = {"on"};
field.value = boolean_value;
break;
case FormFieldType.select1:
SelectOneField sel1 = (SelectOneField) field;
string[] select1_value = {sel1.choices[0].value};
field.value = select1_value;
}
The cast to SelectOneField fails with "Specified cast is not valid." Why???
Am I doing something wrong? Is there a bug in the service somewhere?
Any help appreciated.
Thanks,
-- Greg