代码之家  ›  专栏  ›  技术社区  ›  Andrei Rînea

反序列化在WCF中不起作用

  •  1
  • Andrei Rînea  · 技术社区  · 16 年前

    团队课看起来像

    [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属性保存了一个默认点实例。点结构是 System.Windows.Media.Point

    截获的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 回复  |  直到 16 年前
        1
  •  1
  •   Shiraz Bhaiji    16 年前

    客户端似乎无法识别该数据类型 指向 .

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

        2
  •  1
  •   Andrew    16 年前

    简单说明一下,当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中( http://msdn.microsoft.com/en-us/library/system.windows.point(VS.95).aspx ) .Net 3.0点结构位于windowsbase.dll中( http://msdn.microsoft.com/en-us/library/system.windows.point(VS.85).aspx ) WindowsBase.dll中的.Net 3.5点结构( http://msdn.microsoft.com/en-us/library/system.windows.point.aspx )

    在比较.net和SL时,名称相同,但类不同。

    另外,它发生在SL 2.0中,并在SL网站上报告。( http://silverlight.net/forums/t/26577.aspx

    推荐文章