1

「チーム」としましょう、単純なクラスがあり、チームの配列を返す GetTeams 操作で WCF サービス (IIS でホストされる basicHttpBinding) を公開します。

チームクラスは次のようになります

[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 プロパティを追加して、Position データを複製し、ワイヤーの反対側に正しく配置されるかどうかを確認しました。

インターセプトされた 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 バージョンに渡していると思います。これは、位置 datacontract の名前空間が、SL ポイントとは異なる CLR / WPF ポイントを使用していることを示しているように見えるためです。

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 ) .Net 3.5 Point Struct in WindowsBase.dll ( http://msdn.microsoft.com/ en-us/library/system.windows.point.aspx )

ただし、.net と SL を比較すると、同じ名前であり、同じクラスではありません。

少し追加ですが、SL 2.0 で発生し、SL Web サイトで報告されています。( 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 に答える