如何在 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)]
以解决该问题。
我正在尝试将我们的 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)]
以解决该问题。