Ich suche nach dem schnellsten Weg, um .NET-Objekte zu serialisieren und zu deserialisieren. Folgendes habe ich bisher:
public class TD
{
public List<CT> CTs { get; set; }
public List<TE> TEs { get; set; }
public string Code { get; set; }
public string Message { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public static string Serialize(List<TD> tData)
{
var serializer = new XmlSerializer(typeof(List<TD>));
TextWriter writer = new StringWriter();
serializer.Serialize(writer, tData);
return writer.ToString();
}
public static List<TD> Deserialize(string tData)
{
var serializer = new XmlSerializer(typeof(List<TD>));
TextReader reader = new StringReader(tData);
return (List<TD>)serializer.Deserialize(reader);
}
}
BinaryFormatter
ist in Bezug auf Code und Implementierung extrem schnell, aber eine Lösung wie die von Marc wird in einem Benchmark schneller abschneiden.Antworten:
Hier ist Ihr Modell (mit erfundenem
CT
undTE
) unter Verwendung von Protobuf-Net (wobei die Verwendungsfähigkeit erhalten bleibtXmlSerializer
, was nützlich sein kann - insbesondere für die Migration); Ich gebe demütig (mit vielen Beweise , wenn Sie es brauchen) , dass dies ist der schnellste (oder sicherlich einer der am schnellsten) Allzweck - Serializer in .NET.Wenn Sie Zeichenfolgen benötigen, codieren Sie einfach die Binärdatei mit Base-64.
quelle
Ein comprehansive Vergleich zwischen diffreent Formaten von mir in diesem post- https://maxondev.com/serialization-performance-comparison-c-net-formats-frameworks-xmldatacontractserializer-xmlserializer-binaryformatter-json-newtonsoft-servicestack-text/
Nur eine Probe aus der Post-
quelle
Da ich daran interessiert war, beschloss ich, die vorgeschlagenen Methoden mit dem nächstgelegenen "Äpfel zu Äpfeln" -Test zu testen, den ich konnte. Ich habe eine Konsolen-App mit folgendem Code geschrieben:
Die Ergebnisse haben mich überrascht; Sie waren konsistent, wenn sie mehrmals ausgeführt wurden:
Als ich diese Ergebnisse sammelte, entschied ich mich zu prüfen, ob ProtoBuf oder NetSerializer bei größeren Objekten besser abschneiden. Ich habe die Anzahl der Sammlungen auf 10.000 Objekte geändert, aber die Größe der Arrays auf 1-10.000 anstatt auf 1-100 erhöht. Die Ergebnisse schienen noch deutlicher:
Mein Fazit lautet daher: Es kann Fälle geben, in denen ProtoBuf und NetSerializer gut geeignet sind, aber in Bezug auf die Rohleistung für zumindest relativ einfache Objekte ... BinaryFormatter ist um mindestens eine Größenordnung wesentlich leistungsfähiger.
YMMV.
quelle
Protobuf ist sehr sehr schnell.
Ausführliche Informationen zur Leistung dieses Systems und zu einer Implementierung finden Sie unter http://code.google.com/p/protobuf-net/wiki/Performance .
quelle
Ein weiterer Serializer, der behauptet, superschnell zu sein, ist der Netserializer .
Die auf ihrer Website angegebenen Daten zeigen eine Leistung von 2x gegenüber Protobuf. Ich habe dies nicht selbst versucht. Wenn Sie jedoch verschiedene Optionen prüfen, versuchen Sie dies ebenfalls
quelle
Der in .net enthaltene binäre Serializer sollte schneller sein als der XmlSerializer. Oder ein anderer Serializer für protobuf, json, ...
Für einige von ihnen müssen Sie jedoch Attribute hinzufügen oder auf andere Weise Metadaten hinzufügen. Zum Beispiel verwendet ProtoBuf intern numerische Eigenschafts-IDs, und die Zuordnung muss durch einen anderen Mechanismus irgendwie erhalten bleiben. Die Versionierung ist mit keinem Serializer trivial.
quelle
Ich habe die Fehler im obigen Code entfernt und die folgenden Ergebnisse erzielt: Ich bin mir auch nicht sicher, wie NetSerializer erfordert, dass Sie die von Ihnen serialisierten Typen registrieren, welche Art von Kompatibilität oder Leistungsunterschieden möglicherweise auftreten können.
Geänderter Code
quelle
Sie können Salar.Bois versuchen Serializer der eine anständige Leistung hat. Der Fokus liegt auf der Nutzlastgröße, bietet aber auch eine gute Leistung.
Auf der Github-Seite gibt es Benchmarks, wenn Sie die Ergebnisse selbst sehen und vergleichen möchten.
https://github.com/salarcode/Bois
quelle
Ich habe mir erlaubt , Ihre Klassen in den CGbR-Generator einzuspeisen .
Da es sich in einem frühen Stadium befindet, wird es noch nicht unterstütztDer generierte Serialisierungscode sieht folgendermaßen aus:DateTime
, daher habe ich es einfach durch long ersetzt.Ich habe eine Liste von Beispielobjekten wie folgt erstellt:
Ergebnisse auf meiner Maschine im
Release
Build:Größe: 149000 Bytes
Zeit:
2,059 ms3,13 msBearbeiten: Ab CGbR 0.4.3 unterstützt der binäre Serializer DateTime. Leider ist die
DateTime.ToBinary
Methode wahnsinnig langsam. Ich werde es bald durch etwas schnelleres ersetzen.Edit2: Bei Verwendung von UTC
DateTime
durch Aufrufen wirdToUniversalTime()
die Leistung wiederhergestellt und mit 1,669 ms getaktet .quelle