反序列化在WCF中不起作用
我有一个简单的类,比如“Team”,我使用GetTeams操作公开了一个WCF服务(basicHttpBinding,托管在IIS中),该操作返回一个Team数组 团队课看起来像反序列化在WCF中不起作用,wcf,silverlight,serialization,point,Wcf,Silverlight,Serialization,Point,我有一个简单的类,比如“Team”,我使用GetTeams操作公开了一个WCF服务(basicHttpBinding,托管在IIS中),该操作返回一个Team数组 团队课看起来像 [DataContract] public class Team { [DataMember] public int Id { get; set; } [DataMember] public Point Position { get; set; } [DataMember]
[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应用程序)上,我获得了所有数据,但Position属性保存了一个默认点实例。点结构是可序列化的。我还添加了X和Y属性来复制位置数据,以查看它是否位于导线的另一端
截获的XML(谢谢,Firebug!)如下所示:
<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>
A23HJGF23
真的
1.
572194.59937858
322518.3889979
572194.59937858
322518.3889979
因此,似乎存在反序列化问题没有引发异常强>
为什么?简单说明一下,当SL尝试使用SL point类时,您的WCF服务是否返回.net 3/3.5 point类?或者它们都是指相同的点结构 我认为您正在将.Net版本传递给SL版本,因为datacontract位置中的名称空间似乎表明您正在使用CLR/WPF点,这与SL点不同 WCF端点将使用ISerializable来更改为XMLSerializer,而不是数据协定序列化器,因此您将看到数据,但它是一个自定义类,具有您目前在XML中看到的_x和_y 编辑: 为了清楚地显示结构位置 SL3点结构位于System.Windows.DLL()中 .Net 3.0点结构位于windowsbase.dll()中 WindowsBase.dll()中的.Net 3.5点结构 在比较.net和SL时,名称相同,但类不同
另外,它发生在SL 2.0中,并在SL网站上报告。()看起来客户端无法识别数据类型点 正如您所指出的,System.Windows.Media.point在.Net 3.0和Silverlight中
您可以尝试在数据协定中将点声明为System.Windows.Media.Point。还要确保在客户端项目中引用了必要的dll。System.Windows.Point结构是WindowsBase程序集中.NET 3.0及以上版本的一部分。Silverlight引用了相同的结构。SL点位于C:\Program Files\Reference Assembly\Microsoft\Framework\Silverlight\v3.0\System.Windows.dll中。Net3.5点位于C:\Program Files\Reference Assembly\Microsoft\Framework\v3.0\WindowsBase.dll中。在我的对象浏览器中,我有两个不同的点结构,1表示SL,1对于.net3.0-值得检查。如果框架3.0文件夹名为,那么这应该是.net3.0点。