2009-03-09 9 views
14

Ich verwende derzeit den binären Formatierer (Remoting) zum Serialisieren und Deserialisieren von Objekten zum Senden in meinem LAN.Schnellster Serializer und Deserializer mit dem geringsten Speicherbedarf in C#?

Ich habe vor kurzem von 2.0 auf .NET 3.5 aktualisiert. Hat 3.5 neue Typen eingeführt, um die Serialisierungsleistung zu verbessern?

Ich habe mir die DataContractSerializer angesehen, aber das serialisiert alles zu zugrunde liegenden XML-Rechten ..., die den Speicherbedarf erhöhen müssen.

Was ist der schnellste Serializer zum Senden von Objekten über mein LAN? Ich interessiere mich nicht für Interop oder Versionierung .... Ich brauche Geschwindigkeit!

Ich bin offen für Open-Source-Alternativen von Drittanbietern.

+0

Es sieht so aus, als gäbe es hier zwei Fragen ... Die schnellste Serialisierung ist die eine, die andere Serialisierung mit dem geringsten Speicherbedarf. –

+0

@Mauricio: Es ist immer eine Frage der Balance. Sie suchen normalerweise nach dem Optimum zwischen den beiden Qualitäten, also berücksichtigen Sie beide gleichzeitig. –

+0

mögliches Duplikat von [Schnellster Weg zum Serialisieren und Deserialisieren von .NET-Objekten] (http://stackoverflow.com/questions/4143421/fastest-way-to-serialize-and-deserialize-net-object) – nawfal

Antwort

8

Es klingt wie Protocol Buffers könnte das sein, was Sie suchen.

Es gibt drei bekannte .NET-Implementierungen: protobuf-net, protobuf-csharp-port und Proto#.

Die performance comparisons zeigen, dass Protokollpuffer die integrierten Serializer sowohl hinsichtlich der Größe als auch der Serialisierungs-/Deserialisierungsgeschwindigkeit übertreffen.

+6

Was ist der Unterschied zwischen diesen? drei .NET-Implementierungen? –

+1

@StefanSteinegger Sie sind verschiedene Implementierungen von Protobuf, von verschiedenen Entwicklern.Wie für die Situation jetzt: Proto # scheint zu verschwinden, sowohl Protobuf-Net und Protobuf-Csharp-Port wurden von ausgezeichneten Entwicklern implementiert. Die richtigen Links sind https://github.com/mgravell/protobuf-net und https://github.com/jskeet/protobuf-csharp-port. – atlaste

2

In der performance comparison verbunden von @Luke, beachten Sie, dass DataContractJsonSerializer sehr gut im Vergleich zu den anderen MS-Serialisierer funktioniert.

Angesichts der Allgegenwärtigkeit von JSON, und die Leichtigkeit, die Sie DataContractJsonSerializer verwenden können, sehe ich nicht viel Grund, "Protokollpuffer" zu verwenden. JSON wird einfacher zu debuggen sein, wenn es zwischen Sprachen und Plattformen springt, und es wird wunderbar komprimiert.

(Ich liebe, wie Google CS 101 Konzepte nimmt und berühmt wird sie für die Umsetzung. In C, wir „Protokollpuffer“ „Struktur“ s nennen. Sie arbeiten super.)

+0

C-Strukturen (oder C++ in meinem Fall) wäre toll, aber .Net (wie von OP verlangt) und Java serialisieren nicht nur die Daten der Struktur, sie serialisieren auch die Strukturdefinition zu einem Punkt. Der Protokollpuffer ermöglicht außerdem das Hinzufügen von _ "neuen Feldern zu Ihren Nachrichtenformaten, ohne die Abwärtskompatibilität zu beeinträchtigen;" _ [siehe Entwicklerhandbuch] (https://developers.google.com/protocol-buffers/docs/overview). – Trisped

5

ich einige benchmarks for the leading .NET serializers zur Verfügung haben, basierend auf der Northwind-Datensatz.

@marcgravell binäre protobuf-net gebenchmarkt die schnellsten Implementierungen ist, dass etwa 7x ist schneller als Microsoft schnellste Serializer verfügbar (XML DataContractSerializer) in der BCL.

Microsofts JsonDataContractSerializer ist ziemlich langsam - über 9x langsamer dass protobuf-net und über 3.6x langsamer als meine eigenen JsonSerializer.

+0

Was ist mit Simon Hewitts Bibliothek? Siehe * [Optimierung der Serialisierung in .NET - Teil 2] (http://www.codeproject.com/dotnet/OptimizingSerialization2.asp) * oder * [Wie große Objekte in .NET serialisiert werden?] (Http: // stackoverflow. com/questions/709399/how-to-serialisieren-große-objekte-in-net-outofmemory-ausnahmen/1290530 # 1290530) *. –

0

Wie ich in this answer gezeigt habe, könnte der generierte Code der schnellste Serializer sein. Es ist jedoch in einem frühen Stadium und es fehlen noch einige Funktionen, die andere Serialisierer bieten.