如何在 wcf web 服务中序列化嵌套的 类 通用函数以在 REST 中使用?

How to serialize nested classes on generic functions in wcf web service to use in REST?

我正在尝试将我们的 Web 服务方法作为 REST (json) 服务。我在 web.config 上进行了一些配置,并将该属性添加到网络服务的功能中,如下所示。

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "Echo")]
ResultSet<EchoObj> GetEcho(string sth);

它也有这样的实现:

public ResultSet<EchoObj> GetEcho(string sth)
{
     ResultSet<EchoObj> obj = new ResultSet<EchoObj>();
     obj = DoSomeWork();
     if(obj.IsOk)
     {
          obj.Item = new EchoObj();
          obj.Item.Sound = "My Sound";
          obj.Item.Volume = Volume.High;
     } else 
     {
          obj.ErrorDesc = "Sound not found.";
     }
     return obj;
}

在这里,如果对象有错误,它returns 正确响应。如果 obj 没问题,那么它不会做出任何响应。我敢肯定,这是由于序列化错误造成的。

ResultSet 和 EchoObj classes 在下面:

结果集class:

[DataContract(Name = "ResultSet")]
public class ResultSet<T> where T : class
{
    [DataMember()]
    public bool IsOk{ get; set; }

    [DataMember()]
    public string ErrorDesc { get; set; }

    [DataMember()]
    public T Item { get; set; }

    ...
}

EchoObj class:

[DataContract]
public class EchoObj : WaveObj
{
    [DataMember]
    public string Sound { get; set; }

    [DataMember]
    public string Volume { get; set; }

    [DataMember]
    public DateTime TimeAt { get; set; }

    [DataMember]
    public override string Code
    {
        get { return "TestSound"; }
    }

    [DataMember]
    public override string Type
    {
        get { return "Test"; }
    }
}

编辑: 我忘了派生的 class WaveObj,它看起来像下面这样:

[DataContract]
public class WaveObj
{
    [DataMember]
    public virtual string Code { get; set; }

    [DataMember]
    public virtual string Type { get; set; }

    ...
}

我想,WaveObj 和 EchoObj 有问题,但我找不到。

有什么办法可以解决该序列化错误吗?

非常感谢。

请查看 'KnownType' 属性 http://blogs.msdn.com/b/darrylru/archive/2011/05/04/datacontract-serialization-with-generics-amp-read-only-properties.aspx

我在书上搜索以了解这里的问题是什么,我知道,wcf 不理解 DateTime 属性 以仅使用 DataMember 属性将其序列化为 json。该属性应如下所示:

[DataContract]
public class EchoObj : WaveObj
{
     [DataMember]
     public string Sound { get; set; }

     [DataMember]
     public string Volume { get; set; }

     [DataMember(EmitDefaultValue = false)]
     public DateTime TimeAt { get; set; }

     [DataMember]
     public override string Code
     {
         get { return "TestSound"; }
     }

     [DataMember]
     public override string Type
     {
         get { return "Test"; }
     }
}

DateTime 属性 的属性应该是 [DataMember(EmitDefaultValue = false)] 以解决该问题。