Solved

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

Posted on 2007-11-28
8
3,176 Views
Last Modified: 2013-11-19
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
Comment
Question by:anwar ul haque
  • 4
  • 3
8 Comments
 
LVL 21

Expert Comment

by:MogalManic
ID: 20364708
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
 
LVL 7

Expert Comment

by:Infinite_Recursion
ID: 20364715
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
 
LVL 21

Expert Comment

by:MogalManic
ID: 20364730
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
 
LVL 21

Expert Comment

by:MogalManic
ID: 20364867
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
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 2

Author Comment

by:anwar ul haque
ID: 20365516
How can I use this class within my web service. My method's return value is List<KeyValuePair<string,string>>.
0
 
LVL 21

Accepted Solution

by:
MogalManic earned 500 total points
ID: 20365651
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
 
LVL 2

Author Comment

by:anwar ul haque
ID: 20366253
Thank you mates, finally I got desired results.
0
 
LVL 2

Author Comment

by:anwar ul haque
ID: 20366332
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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Execute Stored Procedure for a set of values 5 42
Jquery autocomplete 10 68
.php tree directory? 5 56
Where can I ask about my ASP.NET MVC project? 6 21
Introduction Knockoutjs (Knockout) is a JavaScript framework (Model View ViewModel or MVVM framework).   The main ideology behind Knockout is to control from JavaScript how a page looks whilst creating an engaging user experience in the least …
Introduction Since I wrote the original article about Handling Date and Time in PHP and MySQL (http://www.experts-exchange.com/articles/201/Handling-Date-and-Time-in-PHP-and-MySQL.html) several years ago, it seemed like now was a good time to updat…
Viewers will learn one way to get user input in Java. Introduce the Scanner object: Declare the variable that stores the user input: An example prompting the user for input: Methods you need to invoke in order to properly get  user input:
The viewer will learn how to dynamically set the form action using jQuery.

911 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now