Ich versuche, eine Klasse zu einem String zu serialisieren, indem ich die Boost-Serialisierungsbibliothek verwende und in meiner Klasse mehrere Doppelmitgliedsvariablen enthalten.
Unten ist der Code, den ich zum Serialisieren verwende:
%Vor%Hier ist die Serialisierungsmethode innerhalb meiner Point-Klasse:
%Vor%Wenn ich in eine Zeichenfolge serialisiere, scheint Boost die Double-to-String-Konvertierung nicht so zu handhaben, wie ich es erwarten würde (es scheint Rundungsprobleme zu geben). Wenn man ein bisschen forscht, sieht es so aus, als hätten andere das gleiche Verhalten gemeldet. Ich verstehe auch die Genauigkeitsprobleme, die mit der Umwandlung eines Double in einen String und umgekehrt verbunden sind, und wie dies das Problem verursachen könnte.
Was merkwürdig ist und ich nicht verstehe, ist, dass dies nicht passiert, wenn ich einen Stringstream selbst verwende und das Double zum Stream umadressiere, oder wenn ich die lexical_cast -Funktion von boost zur Umwandlung aus einer stringstream.str verwende () zurück zu einem Doppel. Bevor Boost seine eigenen Serialisierungs- / Deserialisierungsklassen hatte, hatte ich meine eigenen geschrieben, indem ich stringstream und lexical_cast Calls benutzte und es funktionierte ohne Problem. Ich hoffe wirklich, dass ich die Serialisierungsbibliothek nicht verlassen muss und zu dem zurückkehren muss, was ich vorher hatte. Hoffentlich gibt es nur ein Setting / Merkmal / etc. Ich vermisse.
Sie könnten versuchen, Ihren Stream dazu zu zwingen, das wissenschaftliche Format für Fließkommazahlen zu verwenden, bevor Sie ihn serialisieren:
%Vor%Es sieht so aus, als ob die Boost-Bibliothek die Genauigkeit korrekt einstellt, aber nicht das Format zu setzen scheint. Alternativ kann ich denken, dass Sie die Logik zum Speichern und / oder Laden von Fließkommazahlen ableiten und überschreiben können, ohne den Rest der Bibliothek wegzuwerfen - starten Sie hier .
Es sieht auch so aus, als ob es work in progress zur Unterstützung von Unendlichkeiten usw. gibt
Dies beantwortet nicht direkt die Frage Boost.Serialization
, ist aber eine mögliche Problemumgehung.
Aus der obigen Frage ist mir nicht klar, dass Sie eine String-Darstellung benötigen oder nicht. Wenn Sie nach einer plattformübergreifenden Repräsentation (binär oder nicht) suchen, sollten Sie in Erwägung ziehen, protobuf
zu verwenden, das Unterstützung für die Codierung von double
s bietet.
Tags und Links c++ serialization boost floating-point boost-serialization