• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 3256
  • Last Modified:

How to return complex types like Generics(List<KeyValuePair<string,string>> or Dictionary<string,string>) from WebMethod

I am currently working on ASP.NET Web Services and I want to return complex types like System.Collection.Generic class. I tried to return Dictionary<string,string> but this gave me exception. then I tried to return List<KeyValuePair<string,string> objKeyValuePair> but it didnt solve my problem. Can you tell me how can I return complex types. I dont want to serialize my data as this is not my requirement. Thanks in advance for any help or suggestion.
0
anwar ul haque
Asked:
anwar ul haque
  • 4
  • 3
1 Solution
 
MogalManicCommented:
Serialization IS a requirement for Web Services.  Every Web method is converted to XML to send across the wire.  So all of the classes have to be able to be represented as XML strings.  The only solution is to create serializable adapters that take the generic class and convert it into something that can be turned into XML strings.  For example This would be an adapter for a KeyValuePair<string, string>:
[Serializable]
public class KeyValuePairSerializable
{
 
     public KeyValuePairSerializable()
}

Open in new window

0
 
Infinite_RecursionCommented:
As far as I can tell, response of a web service is always in XML, that is why they are called XML Web Services, that means types that are to be returned have to be serializable.
0
 
MogalManicCommented:
Sorry submitted by mistake.  Here is it again:

Note:You could try to make it a Generic class so that it would work with all types of KeyValuePair<t1, t2>.  I'm not sure how it would work though.
[Serializable]
public class KeyValuePairSerializable
{
     private string _key,_value
     public KeyValuePairSerializable()  //Required for serialization
     {
     }
     public KeyValuePairSerializable(KeyValuePair<string, string> value)
     {
        this._key=value.Key;
        this._value=value.Value;
     }
 
     public string Key {
       get {return _key;}
       set {_key=value;}
     }
     public string Value {
       get {return _value;}
       set {_value=value;}
     }
     
}

Open in new window

0
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
MogalManicCommented:
I just did a test and List<T> is serializable, but I could not get List<KeyValuePair<string,string>> to work.  Dictionary<string,string> is NOT XML serializable because it implements IDictionary.  But I got List<KeyValuePairSerializable> to work.
    [WebMethod]
    public List<KeyValuePairSerializable> HelloWorld()
    {
        Dictionary<string, string> hello = new Dictionary<string, string>();
        hello.Add("hello", "world");
        hello.Add("world", "hello");
 
        List<KeyValuePairSerializable> list=new List<KeyValuePairSerializable>();
        foreach (KeyValuePair<string, string> item in hello)
        {
            list.Add(new KeyValuePairSerializable(item));
        }
        return list;
    }

Open in new window

0
 
anwar ul haqueAuthor Commented:
How can I use this class within my web service. My method's return value is List<KeyValuePair<string,string>>.
0
 
MogalManicCommented:
You will have to either create a new method or change the signature so that it returns List<KeyValuePairSerializable>.  Just like I did in my HelloWorld webmethod
0
 
anwar ul haqueAuthor Commented:
Thank you mates, finally I got desired results.
0
 
anwar ul haqueAuthor Commented:
while I was searching for the solution I could not find the answer so that's why I asked my question here.For me points are not issue I got solution and I'm very happy and thakful to these gentlemen.

Thanks.
0

Featured Post

NFR key for Veeam Backup for Microsoft Office 365

Veeam is happy to provide a free NFR license (for 1 year, up to 10 users). This license allows for the non‑production use of Veeam Backup for Microsoft Office 365 in your home lab without any feature limitations.

  • 4
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now