我有一个简单的类,让我们说“团队”,我公开了一个WCF服务(basicHttpBinding,在IIS中托管),其中一个GetTeams操作返回一个Team数组。
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应用程序)上,我获取了所有数据,但Position属性包含一个默认的Point实例。 Point结构是System.Windows.Media.Point,可以序列化。我还添加了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>
因此,似乎存在反序列化问题。 不会抛出异常!
为什么?
答案 0 :(得分:1)
正如快速澄清的那样,当SL试图使用SL点类时,您的WCF服务是否返回.net 3 / 3.5点类?或者他们都指的是相同的点结构。
我想你正在将.Net版本传递给SL版本,因为位置datacontract中的命名空间似乎表明你使用了CLR / WPF点,这与SL点不同。
WCF端点将使用ISerializable更改为XMLSerializer而不是数据协定序列化程序,因此您将看到数据,但是您现在可以在XML中看到带有_x和_y的自定义类。
编辑:
为了清楚结构位置
SL3 Point Struct在System.Windows.DLL(http://msdn.microsoft.com/en-us/library/system.windows.point(VS.95).aspx)中 .Net 3.0 Point Struct在windowsbase.dll中(http://msdn.microsoft.com/en-us/library/system.windows.point(VS.85).aspx) WindowsBase.dll中的.Net 3.5 Point Struct(http://msdn.microsoft.com/en-us/library/system.windows.point.aspx)
相同的名称,但在将.net与SL进行比较时,不是同一个类。
还有一点,它在SL 2.0中出现并在SL网站上报道。 (http://silverlight.net/forums/t/26577.aspx)
答案 1 :(得分:1)
看起来客户端无法识别数据类型点。
正如您所指出的,System.Windows.Media.Point位于.Net 3.0和Silverlight中。
您可以尝试在数据协定中将Point声明为System.Windows.Media.Point。还要确保在客户端项目中引用了必要的dll。