How to return a List<object> in WCF

后端 未结 3 1176
暖寄归人
暖寄归人 2020-12-20 10:00

I have my WCF service returning data both in XML and JSON format.

One functios has to return a List, because I don\'t know which class will be used to fill this list

相关标签:
3条回答
  • 2020-12-20 10:49

    In my case the solution is more simple.

    I have a class that I return in all my mehotds, like this:

    [DataContract]
    public class Result
        {
    
            [DataMember]
            public string KeyMensaje;
            [DataMember]
            public string ErrorMessage;        
            [DataMember]        
            public object Objeto;
    
            ...
       }
    

    The problem is due to Objeto object inside this class. This object is used to return variables types and it can't be serialized if is a complex object, for example:

    res = new Result(list, "ok", "", "", "", null);  
    return res;
    

    In this case object (list) is a list of other custom object, for example List<CustomEmployee>

    The solution is add on top Result class the complex types that object can be, like this:

    [DataContract]
    [KnownType(typeof(List<CustomEmployee>))]
    [KnownType(typeof(CustomEmployee))]
    public class Result
    {
       ...
    }
    
    0 讨论(0)
  • 2020-12-20 10:50

    You could define

    [KnownType(typeof(MyChildObject0))]
    ...
    [KnownType(typeof(MyChildObjectM))]
    public class MyBaseObject { ... }
    
    public class MyChildObject0 : MyBaseObject { ... }
    ...
    public class MyChildObjectM : MyBaseObject { ... }
    

    Or you could add the attribute only once and define static method that returns all M+1 types at once.

    and modify:

    public class WrapHome
    {
      ...
      public List<MyBaseObject> CHART { get;set; }
    }
    
    0 讨论(0)
  • 2020-12-20 10:53

    To make it work, your service has to know the types it needs to serialize. If they cannot be found out by looking at your method's signature (for example because one type is object), you need to list all types that could possibly be in that object.

    Annotate them to the top of your service class, if you list for example can have instances of foo, bar and baz:

    [ServiceKnownType(typeof(foo))]
    [ServiceKnownType(typeof(bar))]
    [ServiceKnownType(typeof(baz))]
    
    0 讨论(0)
提交回复
热议问题