Ich arbeite an einer Haskell-Anwendung, die in dem mit GHCJS kompilierten Browser läuft, der mit einem ebenfalls in Haskell geschriebenen Server über Websockets kommuniziert. Beide Programme teilen die gleiche Haskell-Datentypdefinition und ich muss "nur" das Serialisierungsformat auswählen.
Im Moment läuft das Programm der Einfachheit halber auf Read
und Show
, was funktioniert, ist aber offensichtlich nicht ideal.
cereal
-Bibliothek, die an ByteStrings
arbeiten, tatsächlich in GHCJS effizient sein werden. Darüber hinaus scheint die GHCJS-API die Interaktion von ByteStrings
mit dem binären Blob
-Typ, den die JavaScript-Bindungen zu WebSockets bereitstellen, zu erschweren.
Generische Code-Generierung (mit GHC.Generics
) wäre nett.
Hat jemand dieses Problem vorher gelöst? Möglicherweise sogar Benchmarking verschiedener Serialisierungsvarianten auf GHCJS?
Wir haben im letzten Jahr nach einer schnellen Serializer / Deserializer-Bibliothek in Haskell gesucht, um Daten in einem Reddis-Cache zu speichern, und am Ende haben wir mit ProtoBuf! Das lag teilweise daran, dass wir bereits die ProtoBuf-Implementierung aller Objekte hatten, die wir serialisieren wollten, aber die Leistung war auch viel besser im Vergleich zu Cereal / Binär. Zu der Zeit war speichern nicht existent.
Die Größe und Geschwindigkeit der Serialisierung / Deserialisierung hängt sehr stark von Ihren Daten ab. Zum Beispiel, wenn Sie viele kleine (sagen wir im Bereich 1 bis 100) 64-Bit-Nummern haben, protobuf (wegen seiner Base-128-Variante Kodierung) oder sogar JSON könnte effizienter sein als Müsli oder Binär (das ich denke, eine feste Größe für Zahlen unabhängig von ihren Werten verwenden).
Es gibt auch Typed-Wire , mit dem Sie Serialisierung in ein paar Sprachen durchführen können, aber ich denke es verwendet JSON als zugrunde liegende Implementierung.
Ich habe keine Erfahrung mit GHCJS, aber ich würde empfehlen, store
zuerst zu versuchen. Stellen Sie nur sicher, dass Client und Server keine kleine / große Endian-Inkompatibilität haben.
Tags und Links haskell serialization websocket ghcjs