【问题标题】:Deserialization not working in WCF反序列化在 WCF 中不起作用
【发布时间】:2009-08-13 15:43:26
【问题描述】:

我有一个简单的类,比如说“Team”,我公开了一个 WCF 服务(basicHttpBinding,托管在 IIS 中),它带有一个返回 Team 数组的 GetTeams 操作。

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>

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

为什么?

【问题讨论】:

    标签: wcf silverlight serialization point


    【解决方案1】:

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

    我认为您正在将 .Net 版本传递给 SL 版本,因为位置数据合同中的命名空间似乎表明您使用 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 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)

    【讨论】:

    • System.Windows.Point 结构是 .NET 3.0 及更高版本的 WindowsBase 程序集中的一部分。 Silverlight 指的是相同的结构。
    • SL 点位于 C:\Program Files\Reference Assemblies\Microsoft\Framework\Silverlight\v3.0\System.Windows.dll .Net3.5 点位于 C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\WindowsBase.dll 在我的对象浏览器中,我有两个不同的 Point 结构,1 个用于 SL,1 个用于 .Net 3.0 - 值得检查。
    • 显然应该是 .net3.0 点,给定框架 3.0 文件夹名称。
    【解决方案2】:

    客户端似乎无法识别数据类型Point

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-11
      • 2020-10-16
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多