Search code examples
wcfdeserializationsoapui

WCF deserialization of type object Properties


I am having trouble achieving the following scenario.

We currently have a method which expects a list of 'context' key value pairs. The value however can be of any type.

the goal is to make this method available using WCF. So I created a

public List<Element> Transform(List<Element> elements)
{
... Transformation of elements takes place
}

[DataContract(Namespace = Constants.NAMESPACE)]
public struct Element
{
    [DataMember(Order = 0, IsRequired = true)]
    public string Key;
    [DataMember(Order = 1, IsRequired = true)]
    public object Value;
}

When I use a .Net test project everything works fine.

However, when I call this service using SOAP UI I get an error message:

The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter elements. The InnerException message was 'Element Value cannot have child contents to be deserialized as an object. Please use XmlNode[] to deserialize this pattern of XML.'.

I am having trouble figuring out what to do. any help appreciated.

the xml i use is this:

  <ws:Transform>
     <ws:elements>
           <ws:Element>
              <ws:Key>Key1</ws:Key>
              <ws:Value>A</ws:Value>
           </ws:Element>
           <ws:Element>
              <ws:Key>Key2</ws:Key>
              <ws:Value>B</ws:Value>
           </ws:Element>
        <ws:ScriptName>SetVariable</ws:ScriptName>
     </ws:elements>
  </ws:Transform>

Solution

  • In this case, SoapUI uses .Net technology which does not understand target type for object.

    sending object is not valid across all platforms. In fact you might get an error with a .Net client as well. Your best bet is create a generic xml representation of the Value and have all clients inflate the object from the xml