Frage

Ich habe eine einfache Klasse, sagen wir "Team" und enthüllen einen WCF -Dienst (Basisichttpbinding, gehostet in IIS) mit einem Getteams -Operation, der eine Reihe von Teams zurückgibt.

Die Teamklasse 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) erhalte ich alle Daten, aber die Positionseigenschaft enthält eine Standardpunktinstanz. Die Punktstruktur ist System.Windows.Media.Point Welches ist serialisierbar. Ich habe auch die X- und Y -Eigenschaften hinzugefügt, um die Positionsdaten zu duplizieren, um festzustellen, ob sie am anderen Ende des Kabels direkt angezeigt werden.

Der XML (danke, Firebug!) Sieht so aus wie:

<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 ein Deserialisierungsproblem zu geben. Es wird keine Ausnahme geworfen!

Wieso den?

War es hilfreich?

Lösung

Wird Ihr WCF -Dienst die .NET 3 / 3.5 -Punktklasse zurückgeben, während der SL versucht, die SL -Punktklasse zu verwenden? Oder beziehen sich beide auf dieselbe Punktstruktur?

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

Der WCF -Endpunkt verwendet das iSerializable, um den XMLSerializer anstelle des Datenvertrags -Serializers zu ändern. Sie sehen also die Daten, aber als benutzerdefinierte Klasse mit dem _x und _y, den Sie derzeit in der XML sehen.

Bearbeiten:

Für Klarheit über den Standort der Struktur

SL3 Point Struct ist in System.Windows.dll (http://msdn.microsoft.com/en-us/library/system.windows.point(vs.95).aspx) .Net 3.0 point struct befindet sich in Windowsbase.dll (http://msdn.microsoft.com/en-us/library/system.windows.point(vs.85).aspx) .NET 3.5 Punktstruktur in WindowsBase.dll (http://msdn.microsoft.com/en-us/library/system.windows.point.aspx)

Gleicher Name, nicht die gleiche Klasse, aber beim Vergleich der .NET mit dem SL.

Und ein bisschen ergänzt, es kommt in SL 2.0 auf und wird auf der SL -Website gemeldet. (http://silverlight.net/forums/t/26577.aspx)

Andere Tipps

Sieht so aus, als würde der Client den Datentyp nicht erkannt Punkt.

Wie Sie auf System.Windows.Media.Point hinweisen, ist in .NET 3.0 und Silverlight.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top