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

Mrciga

我正在尝试将我们的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出了点问题,但我找不到。

有什么想法如何解决该序列化错误吗?

非常感谢。

Mrciga

我在书上进行了搜索,以了解这里存在的问题,并且我知道,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)]应用于解决该问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章