如何在wcf Web服务中的泛型函数上序列化嵌套类以在REST中使用?

时间:2015-03-12 14:06:26

标签: c# json web-services wcf rest

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

[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;
}

这里,如果obj有错误,它会正确返回响应。如果obj没问题,那么它就不会有任何反应。我确信,它是由于序列化错误引起的。

ResultSet和EchoObj类如下:

ResultSet类:

[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课程:

[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"; }
    }
}

编辑:我忘了派生类WaveObj,它看起来如下:

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

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

    ...
}

我认为,WaveObj和EchoObj有些不对劲但我找不到。

有任何想法如何修复序列化错误?

非常感谢。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我在书上搜索了解这里的问题是什么,我知道,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)]以解决该问题。