Schnelle und kompakte Objektserialisierung in .NET
Möchte ich mit dem Objekt-Serialisierung für die Kommunikation über das Netzwerk zwischen einem Mono server und Silverlight-clients.
Es ist sehr wichtig, dass die Serialisierung ist platzsparend und sehr schnell, da die server-host mehrere Echtzeit-Spiele.
Welche Technik sollte ich verwenden? Das BinaryFormatter-fügt eine Menge Aufwand, um serialisierte Klassen (die Version, die Kultur -, Klassen-Namen, Attribut-Namen, etc.) ist nicht erforderlich, dass innerhalb dieser Anwendung.
Was kann ich tun, um diesem mehr Raum effizient?
InformationsquelleAutor der Frage Dennis Kempin | 2009-02-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie Protocol Buffers. Ich bin dabei für meine Serialisierung-code von BinaryFormatter mit Kompression, Protokoll-Puffer und erzielen sehr gute Ergebnisse. Es ist effizienter, in Zeit und Raum.
Gibt es zwei .NET-Implementierungen von Jon Skeet und Marc Gravell.
Update: Offizielle .NET-Implementierung finden Sie hier.
InformationsquelleAutor der Antwort Jorge Villuendas Zapatero
Habe ich einige benchmarks für die führenden .NET serialisierungsprogramme verfügbar basiert auf der Northwind-dataset.
@marcgravell binären protobuf-net die schnellsten Implementierungen gemessen, die über 7x schneller als Microsoft Schnellste serializer zur Verfügung (die XML-DataContractSerializer) in der BCL.
Ich auch halten einige open-source high-performance .NET text serialisierungsprogramme:
InformationsquelleAutor der Antwort mythz
Als der Autor, würde ich laden Sie ein, um zu versuchen,protobuf-net; es Schiffe mit binaries für beide Mono 2.0 und Silverlight 2.0, und ist schnell und effizient. Wenn Sie irgendwelche Probleme haben, auch immer, einfach mir eine e-mail (siehe mein Stack Overflow-Profil); die Unterstützung ist kostenlos.
Jon 's version (siehe die früher akzeptierte Antwort) ist auch sehr gut, aber IMO die protobuf-net version ist mehr idiomatische für C# - Jon' s wäre ideal, wenn Sie redeten, C# -, Java -, so könnten Sie eine ähnliche API an beiden enden.
InformationsquelleAutor der Antwort Marc Gravell
Ich hatte ein ähnliches problem, obwohl ich bin nur mit .NET. Ich wollte zum senden von Daten über das Internet so schnell und einfach wie möglich. Ich habe nichts gefunden, das wäre ausreichend optimiert, also machte ich meine eigenen serializer, benannt NetSerializer.
NetSerializer hat seine Grenzen, aber Sie hat nicht auf meine Verwendung. Und ich habe es nicht getan benchmarks für eine Weile, aber es war viel viel schneller als alles, was ich fand.
Ich habe es nicht versucht, auf Mono-oder Silverlight. Ich Wette, es funktioniert auf Mono, aber ich bin mir nicht sicher, was die Höhe der Unterstützung ist für DynamicMethods auf Silverlight.
InformationsquelleAutor der Antwort Tomba
Könnte passieren Sie die Daten durch eine DeflateStream oder GZipStream zu komprimieren vor der übertragung. Diese Klassen Leben, in der System.IO.Kompression namespace.
InformationsquelleAutor der Antwort Sean
Könnten Sie versuchen, mithilfe von JSON. Es ist nicht so, Bandbreite effizient wie Protocol Buffers, aber es würde viel einfacher sein, um Nachrichten überwachen mit tools wie Wireshark, die viel hilft, wenn Probleme beim Debuggen. .NET 3.5 kommt mit einem JSON-serializer.
InformationsquelleAutor der Antwort Pablote
Ich hatte ein sehr ähnliches problem - speichern in einer Datei. Aber die folgenden können auch verwendet werden, über ein Netzwerk, wie es war, eigentlich konzipiert für remoting.
Die Lösung ist zu verwenden, Simon Hewitt Bibliothek - siehe Optimierung
Serialisierung in .NET - Teil 2.
Teil 1 der Artikel steht (das Fett gedruckte ist mein Schwerpunkt):
"... Wenn Sie je benutzt habe .NET remoting für große Mengen
Daten, die Sie gefunden haben, dass es Probleme mit
die Skalierbarkeit. Für kleine Mengen von Daten, funktioniert es auch
genug, aber größere Mengen nehmen viel CPU und Speicher,
generieren riesige Mengen an Daten für die übertragungund
kann der Fehler mit Out Of Memory exceptions. Es gibt auch eine große
problem mit die Zeit genommen, um tatsächlich die
Serialisierung - große Datenmengen können machen es unmöglich
für die Verwendung in apps......."
Bekam ich ein ähnliches Ergebnis für meine spezielle Anwendung, 40
mal schneller speichern und 20 mal schneller laden (von
Minuten, Sekunden). Die Größe der serialisierten Daten
auch viel reduziert. Ich erinnere mich nicht genau, aber es
war mindestens 2-3 mal.
Ist es ziemlich einfach, um loszulegen. Es gibt jedoch ein
gotcha: verwenden Sie nur .NET serialisieren für höchste
Ebene datastructure (serialisieren/deserialisation
gestartet wurde) und rufen Sie dann das serialisieren/deserialisation
Funktionen, die direkt für die Felder in der höchsten Stufe
datastructure. Sonst gibt es keine speed-up...
Zum Beispiel, wenn eine bestimmte Datenstruktur (sagen
Generic.List
) wird nicht unterstützt, die von der Bibliothek dann .NETserialisieren wird stattdessen verwendet, und dies ist ein no-no. Statt
serialise der Liste im client-code (oder ähnlich). Für ein Beispiel
sehen, in der Nähe von "'Dies ist unsere eigene Codierung." in der gleichen Funktion
wie unten aufgeführt.
Referenz: code aus meiner Anwendung - See in der Nähe von "Hinweis: dies ist der einzige Ort, wo wir die eingebaut .NET ...".
InformationsquelleAutor der Antwort Peter Mortensen
Können Sie versuchen, BOIS, welches sich auf die gepackten Daten Größe und bietet die beste Verpackung so weit. (Ich habe nicht gesehen, besser für die Optimierung noch nicht.)
https://github.com/salarcode/Bois
InformationsquelleAutor der Antwort Salar