反序列化在WCF中不工作
我有一个简单的类,让我们说“团队”,我公开一个WCF服务(basicHttpBinding,托管在IIS中)与GetTeams操作返回一个Team数组。反序列化在WCF中不工作
Team类看起来像
[DataContract]
public class Team
{
[DataMember]
public int Id { get; set; }
[DataMember]
public Point Position { get; set; }
[DataMember]
public string Code { get; set; }
[DataMember]
public bool Available { get; set; }
[DataMember]
public string Extra { get; set; }
[DataMember]
public double X { get; set; }
[DataMember]
public double Y { get; set; }
}
在客户端(Silverlight的应用程序3.0)我得到的所有数据,但该位置属性包含默认Point实例。 Point结构是System.Windows.Media.Point,它是可序列化的。我还添加了X和Y属性来复制位置数据,以查看它是否正确地位于电线的另一端。
的XML拦截(!感谢,萤火虫)看起来像这样:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<GetTeamsResponse xmlns="http://tempuri.org/">
<GetTeamsResult xmlns:a="http://schemas.datacontract.org/2004/07/MyProject.Data" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:Team>
<a:Code>A23HJGF23</a:Code>
<a:Available>true</a:Available>
<a:Extra i:nil="true"/>
<a:Id>1</a:Id>
<a:Position xmlns:b="http://schemas.datacontract.org/2004/07/System.Windows">
<b:_x>572194.59937858</b:_x>
<b:_y>322518.3889979</b:_y>
</a:Position>
<a:X>572194.59937858</a:X>
<a:Y>322518.3889979</a:Y>
</a:Team>
<!-- other <a:Team> elements -->
</GetTeamsResult>
</GetTeamsResponse>
</s:Body>
</s:Envelope>
因此它似乎有一个反序列化的问题。 没有例外!
为什么?
就像一个快速的说明,你的WCF服务返回.net 3/3.5点类,而SL正在尝试使用SL点类?或者他们都指的是相同的点结构。
我想你是通过.NET版本的SL版本,因为位置datacontract中的名称空间似乎表明您使用CLR/WPF点,这是不一样的SL点。
WCF端点将使用ISerializable来更改为XMLSerializer而不是数据协定序列化程序,因此您将看到数据,但是您将看到数据,但是作为自定义类,带有_x和_y,您目前在XML中看到该类。
编辑:
为了清楚起见在结构位置
SL3 Point结构是在System.Windows.dll中(http://msdn.microsoft.com/en-us/library/system.windows.point(VS.95).aspx) NET 3.0 Point结构是在WindowsBase.dll(http://msdn.microsoft.com/en-us/library/system.windows.point(VS.85).aspx) 净3.5 WindowsBase.dll中的点结构(http://msdn.microsoft.com/en-us/library/system.windows.point.aspx)
但是,当将.net与SL进行比较时,名称相同,但不是相同的类。
还有一点,它发生在SL 2.0中,并在SL网站上报告。 (http://silverlight.net/forums/t/26577.aspx)
看起来客户端无法识别数据类型点。
正如你指出System.Windows.Media.Point在.Net 3.0和Silverlight中。
您可以尝试在数据合同中声明Point为System.Windows.Media.Point。还要确保在客户端项目中引用了必需的dll。
System.Windows.Point结构是.NET 3.0的一部分,在WindowsBase程序集中是向上的。 Silverlight指的是相同的结构。 – 2009-08-13 16:01:31
SL Point位于C:\ Program Files \ Reference Assemblies \ Microsoft \ Framework \ Silverlight \ v3.0 \ System.Windows.dll .Net3.5 Point位于C:\ Program Files \ Reference Assemblies \ Microsoft \ Framework \ V3.0 \ WindowsBase。dll 在我的对象浏览器中,我有两个不同的Point结构,1个用于SL,1个用于.Net 3.0 - 值得检查。 – Andrew 2009-08-13 16:08:23
那应该是.net3.0明显给出的框架3.0文件夹名称。 – Andrew 2009-08-13 16:09:02