1

我有一个简单的类,比方说“团队”,并且我使用 GetTeams 操作公开了一个 WCF 服务(basicHttpBinding,托管在 IIS 中),该操作返回一个团队数组。

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>

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

为什么?

4

2 回答 2

1

快速澄清一下,当 SL 尝试使用 SL 点类时,您的 WCF 服务是否返回 .net 3 / 3.5 点类?或者他们都指的是同一个点结构。

我认为您正在将 .Net 版本传递给 SL 版本,因为位置数据合同中的命名空间似乎表明您使用 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 点结构 ( http://msdn.microsoft.com/ en-us/library/system.windows.point.aspx )

将 .net 与 SL 进行比较时,名称相同,但类别不同。

还有一点补充,它发生在 SL 2.0 中并在 SL 网站上进行了报告。( http://silverlight.net/forums/t/26577.aspx )

于 2009-08-13T15:58:34.733 回答
1

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

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

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

于 2009-08-13T16:10:25.043 回答