反序列化在WCF中不起作用

时间:2009-08-13 15:43:27

标签: wcf silverlight serialization point

我有一个简单的类,让我们说“团队”,我公开了一个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>

因此,似乎存在反序列化问题。 不会抛出异常!

为什么?

2 个答案:

答案 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。