2009-08-13 4 views
1

Ich habe eine einfache Klasse, sagen wir "Team" und ich einen WCF-Dienst (basicHttpBinding, in IIS gehostet) mit einer GetTeams-Operation, die ein Array von Team zurückgibt.Deserialisierung funktioniert nicht in WCF

Das Team Klasse sieht aus wie

[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; } 
} 

auf dem Client (Silverlight 3.0 app) ich alle Daten erhalten, aber die Eigenschaft Position hält eine Standard-Point-Instanz. Die Point-Struktur ist System.Windows.Media.Point, die serialisierbar ist. Ich fügte auch die X- und Y-Eigenschaften hinzu, um die Positionsdaten zu duplizieren, um zu sehen, ob sie direkt am anderen Ende der Leitung ankommen.

Die XML abgefangen (! Danke, Firebug) sieht so aus:

<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> 

Daher scheint es eine Deserialisierung Problem. Keine Ausnahme wird geworfen!

Warum?

Antwort

1

Nur zur schnellen Klärung: Gibt Ihr WCF-Dienst die .net 3/3.5-Punktklasse zurück, während der SL versucht, die SL-Punktklasse zu verwenden? Oder beziehen sie sich beide auf dieselbe Punktstruktur?

Ich glaube, dass Sie die .Net-Version an die SL-Version übergeben, da dieser Namespace in der Position datacontract angibt, dass Sie den CLR/WPF-Punkt verwenden, der nicht mit dem SL-Punkt übereinstimmt.

Der WCF-Endpunkt verwendet ISerializable, um anstelle des Serialisierers für Datenverträge in den XMLSerializer zu wechseln. Sie sehen also die Daten, aber als benutzerdefinierte Klasse mit dem _x und _y, die Sie derzeit im XML-Format sehen.

Edit:

Aus Gründen der Klarheit über die Struktur Standort

SL3 Punkt Struct in System.Windows.DLL ist (http://msdn.microsoft.com/en-us/library/system.windows.point(VS.95).aspx) .Net 3.0 Punkt Strukt ist in 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)

Gleicher Name, nicht die gleiche Klasse jedoch beim Vergleich der .net mit dem SL.

Und ein bisschen eine Zugabe, es kommt in SL 2.0 vor und wird auf der SL-Website berichtet. (http://silverlight.net/forums/t/26577.aspx)

+0

Die System.Windows.Point-Struktur ist Teil von .NET 3.0 und höher in der WindowsBase-Assembly. Silverlight bezieht sich auf dieselbe Struktur. –

+0

SL Point befindet sich in C: \ Programme \ Referenz-Assemblies \ Microsoft \ Framework \ Silverlight \ v3.0 \ System.Windows.dll .Net3.5 Point befindet sich in C: \ Programme \ Reference Assemblies \ Microsoft \ Framework \ v3.0 \ WindowsBase.dll In meinem Objektbrowser habe ich zwei verschiedene Point-Strukturen, 1 für SL, 1 für. Net 3.0 - lohnt sich zu überprüfen. – Andrew

+0

das sollte der .net3.0-Punkt offensichtlich gegeben werden, der Ordnersame framework 3.0. – Andrew

1

Sieht aus wie der Client den Datentyp Punkt nicht erkennt.

Wie Sie darauf hingewiesen System.Windows.Media.Point ist in. Net 3.0 und Silverlight.

Sie könnten versuchen, Point als System.Windows.Media.Point in Ihrem Datenvertrag zu deklarieren. Stellen Sie außerdem sicher, dass im Clientprojekt auf die erforderlichen DLLs verwiesen wird.