2 Stimmen

WCF Empfohlene Ansätze für die Serialisierung mehrerer Objekte

Ich versuche, einen möglichen Engpass zu umgehen.

Ich habe eine Serveranwendung, die Objekte aus einer Datenbank an entfernte Anwendungen liefert, die mit 1 - n Objekten von 1 - n verschiedenen Typen arbeiten können (wobei n eine relativ hohe Zahl sein kann), die alle eine gemeinsame Schnittstelle implementieren, aber viele einzigartige Eigenschaften für verschiedene Typen enthalten können.

Die Client-Anwendungen speichern die Serverobjekte in einem lokalen Cache, bis sie bereit sind, sie über den Server in die Datenbank zurückzuschreiben.

Dies wird derzeit in WCF mit jeder Klasse, die einen DataContract definiert, durchgeführt.

Aufgrund der möglicherweise großen Menge an Objekten, die an den Server zurückgegeben werden müssen (dies hängt von der Implementierung ab), würde ich es vorziehen, diese nicht mehr als Einzelaufrufe auszuführen, sondern alle Objekte in einen einzigen serialisierten (oder besser noch komprimierten) Stream zu verpacken und sie als eine Verbindung zum Server zu senden.

Ich kann ganz einfach meine eigene Lösung finden, aber ich würde es vorziehen, einen empfohlenen Ansatz zu verwenden, und ich hoffe, dass jemand einen vorschlagen kann. Wenn Sie mich überzeugen können, bin ich auch bereit zu akzeptieren, dass mein Ansatz wahrscheinlich nicht die beste Idee ist.

3voto

Marc Gravell Punkte 970173

Wie hoch ist "relativ hoch"?

Eine Möglichkeit ist zum Beispiel die Verwendung eines Wrapper-Objekts:

[DataContract]
public class Wrapper {
    [DataMember(Order = 1)]
    public List<Foo> Foos {get {...}}

    [DataMember(Order = 2)]
    public List<Bar> Bars {get {...}}

    [DataMember(Order = 3)]
    public List<Blop> Blops {get {...}}
}

Dann sollten Sie in der Lage sein, eine einzige Nachricht mit einer beliebigen Anzahl von Foo , Bar und/oder Blop Aufzeichnungen. Meine Einbeziehung der Order Attribut war beabsichtigt - wenn Sie die Größe des Datenstroms verringern wollen, sollten Sie protobuf-net - Mit dem obigen Layout kann protobuf-net einfach in WCF einhaken, indem es [ProtoBehavior] auf die Methode (in der Schnittstelle des Operationsvertrags), die Sie angreifen wollen (sowohl auf dem Client als auch auf dem Server). Damit wird die Übertragung auf das Binärformat "protocol buffers" von Google umgestellt, wobei base-64 zur Kodierung verwendet wird. Wenn Sie die Basic-http-Bindung verwenden, kann dies auch MTOM verwenden, wenn es aktiviert ist, so dass selbst Base-64 kein Problem darstellt. Auf diese Weise können Sie erhebliche Einsparungen bei der Datenübertragung (~1/5 des Platzes, basierend auf den angegebenen Zahlen).

(edit 1 - protobuf-net geht davon aus, dass Foo , Bar y Blop auch verwenden Sie die Order Attribut)

(edit 2 - beachten Sie, dass Sie den Antrag immer in eine Reihe von mittelgroßen Wrapper Nachrichten und rufen dann eine Methode auf, um alle Änderungen anzuwenden, sobald sie auf dem Server vorliegen (vermutlich in einer Staging-Tabelle in der Datenbank).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X