反序列化在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

+0

System.Windows.Point结构是.NET 3.0的一部分,在WindowsBase程序集中是向上的。 Silverlight指的是相同的结构。 – 2009-08-13 16:01:31

+0

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

+0

那应该是.net3.0明显给出的框架3.0文件夹名称。 – Andrew 2009-08-13 16:09:02

看起来客户端无法识别数据类型

正如你指出System.Windows.Media.Point在.Net 3.0和Silverlight中。

您可以尝试在数据合同中声明Point为System.Windows.Media.Point。还要确保在客户端项目中引用了必需的dll。