Deser is a library for serializing and deserializing Nim data structures efficiently and generically. Just like Serde.
Explore
First, install Deser via nimble install deser.
Deser is not a parser library. You need to install some parser from Supported formats.
We use deser_json for example - nimble install deser_json.
Let's say we have an API with Message type that has this output:
const json = """ { "id": 1, "text": "Hello!", "created": 1660848266 } """
Let's try to map it to the Nim object. Use makeSerializable and makeDeserializable to generate serialize and deserialize procedures for your type.
import deser, deser_json type Message = object id: int text: string created: int makeSerializable(Message) makeDeserializable(Message)
Use toJson and fromJson procedures from deser_json to serialize and deserialize to/from JSON:
let chat = Message.fromJson(json) echo chat.toJson()
De/serialize Time and DateTime
In previous section we created Message type where created field is the time in unix format.
It is not convenient to work with it as int. But if we try to just use Time, we get an error:
Error: type mismatch: got <typedesc[Time], Deserializer> but expected one of: ...
To fix this error, we need to use the serializeWith and deserializeWith pragmas.
Full code:
import std/times import deser, deser_json proc toTimestamp(self: Time, serializer: var auto) = serializer.serializeInt64(self.toUnix()) proc fromTimestamp(deserializer: var auto): Time = fromUnix(deserialize(int64, deserializer)) type Message = object id: int text: string created {.serializeWith(toTimestamp), deserializeWith(fromTimestamp).}: Time makeSerializable(Message) makeDeserializable(Message)
Example:
import std/times import deser, deser_json type Message = object id: int text: string created {.deserWith(UnixTimeFormat).}: Time const json = """ { "id": 1, "text": "Hello!", "created": 1660848266 } """ let chat = Message.fromJson(json) echo chat.toJson()
Supported std-types
- bool
- int8-64 (int serializaed as int64)
- uint8-64 (uint serialized as uint64)
- float32-64 (float serializaed as float64)
- char
- string
- seq
- array
- enum (serialized as the parser decides)
- tuple (serialized as array)
- set
- range
- Option
- HashSet
- OrderedSet
- Table
- OrderedTable
Supported formats
- JSON - deser_json
Customize serialization process
Deser allows you to customize the serialization process, and the configuration will be applied to any parser.
Configuration is done with pragmas that are applied at compile-time. View available pragmas.
How to make bindings
Check example at deser_json.
Check helpers templates for serialization and deserialization.
Exports
-
skipPrivate, onUnknownKeys, skipped, renameAll, skipPrivateSerializing, RenameCase, skipSerializing, skipSerializeIf, skipPrivateDeserializing, deserializeWith, deserWith, serializeWith, untagged, defaultValue, skipDeserializing, aliases, renameDeserialize, renamed, renameSerialize, visitInt64, visitFloat32, visitUint32, visitInt32, visitString, initUnexpectedMap, visitInt64, visitUint32, visitUint64, visitSome, expecting, visitFloat64, visitUint32, visitString, deserialize, visitInt16, visitFloat64, visitSeq, expecting, visitSome, initUnexpectedFloat, visitFloat32, visitInt16, visitInt32, visitBytes, visitUint32, visitString, visitInt32, visitBool, visitUint64, visitSeq, visitChar, visitUint64, visitInt16, deserialize, visitUint8, visitInt32, visitUint64, visitUint8, visitMap, visitSeq, visitInt8, visitUint32, visitInt64, visitInt8, visitString, visitSome, visitInt8, visitMap, visitInt64, visitFloat64, visitUint16, visitUint64, visitChar, visitFloat32, visitMap, visitMap, deserialize, visitUint32, visitUint16, visitUint8, visitMap, visitInt16, visitUint32, visitBool, expecting, raiseMissingField, visitSeq, visitInt64, visitInt32, expecting, visitInt64, visitBytes, visitFloat64, visitNone, visitSeq, visitSome, visitFloat64, NoneSeed, visitUint8, visitUint64, visitUint8, visitInt64, visitMap, deserialize, visitFloat64, visitFloat64, visitUint64, visitUint8, visitNone, visitFloat32, visitBytes, visitInt64, deserialize, visitSeq, visitUint64, visitUint16, visitUint8, visitSeq, expecting, visitSeq, visitBool, visitSome, visitInt64, visitInt16, Unexpected, visitNone, visitInt16, implMapAccess, visitUint8, visitUint16, deserialize, visitUint64, visitInt8, visitBool, InvalidType, visitFloat32, visitSome, visitFloat32, visitInt8, visitUint64, visitNone, visitSeq, expecting, visitSome, visitInt16, visitSeq, expecting, visitUint32, visitUint64, visitUint32, DeserializationError, deserialize, visitBytes, visitUint32, visitUint64, visitUint32, visitMap, visitUint16, visitUint32, visitUint64, visitUint16, deserialize, visitInt8, visitInt32, visitInt32, visitNone, visitInt32, visitInt64, visitBytes, visitInt8, visitNone, visitChar, visitSome, visitInt16, visitFloat64, visitBool, visitInt32, visitChar, visitMap, visitInt8, visitFloat64, visitMap, visitBool, expecting, visitInt64, visitFloat64, visitUint8, deserialize, visitNone, visitSeq, visitNone, visitNone, visitMap, visitFloat32, InvalidValue, visitUint32, visitString, visitUint32, expecting, visitChar, visitInt16, visitBool, visitString, visitInt16, visitInt64, visitInt16, visitInt16, deserialize, visitInt64, visitMap, visitMap, visitUint8, expecting, visitInt32, visitSome, visitUint32, visitUint8, makeDeserializable, visitUint64, visitUint8, visitInt32, visitMap, visitInt32, visitInt64, visitBytes, visitString, visitUint16, visitNone, visitChar, visitUint64, visitSeq, visitUint64, visitUint8, expecting, visitBytes, visitFloat32, visitInt64, visitSeq, expecting, visitMap, visitUint32, visitChar, expecting, expecting, visitSome, visitFloat32, visitInt8, visitBool, visitInt64, expecting, visitInt64, visitUint32, visitUint32, visitString, raiseInvalidType, visitSeq, visitUint8, visitUint32, expecting, visitString, visitNone, visitUint16, deserialize, visitUint64, visitInt8, visitUint64, visitUint64, visitInt32, visitInt32, visitString, visitInt32, visitUint8, visitBool, visitInt32, visitBytes, visitUint8, visitBytes, visitSeq, visitSome, visitUint32, visitMap, visitFloat32, initUnexpectedChar, visitInt32, visitUint32, visitInt64, visitBytes, visitFloat64, visitUint16, visitBool, visitInt8, visitUint16, visitString, visitUint16, visitMap, visitUint16, visitSeq, visitInt8, expecting, visitBool, visitInt32, visitInt16, visitBytes, visitFloat64, visitInt8, visitUint32, visitUint16, visitUint16, visitFloat64, visitBool, InvalidLength, visitUint64, raiseUnknownField, visitChar, visitBool, visitInt8, visitString, visitSeq, visitInt16, visitChar, visitBytes, visitInt16, visitFloat32, visitInt16, visitInt32, visitUint32, visitInt32, visitString, visitString, expecting, visitString, visitUint8, visitMap, UnknownField, visitUint16, deserialize, visitUint64, visitUint64, visitUint8, visitUint32, visitInt32, visitNone, visitSome, deserialize, visitUint8, visitInt64, visitUint16, expecting, visitNone, visitUint8, visitInt8, visitSome, visitUint64, visitMap, visitInt16, visitBytes, visitSome, visitFloat64, expecting, visitInt16, visitUint32, visitUint32, visitInt64, visitUint32, visitChar, visitSeq, deserialize, visitUint64, visitChar, visitFloat32, expecting, visitUint16, deserialize, visitSeq, visitSome, visitBool, visitUint16, visitSeq, expecting, initUnexpectedUnsigned, visitBytes, visitUint32, visitUint16, visitChar, visitInt64, expecting, visitUint8, visitUint16, visitInt32, DuplicateField, visitInt16, visitSome, visitUint64, visitChar, visitSeq, visitSome, expecting, visitInt32, visitSome, visitChar, visitChar, visitInt32, visitChar, visitFloat32, visitInt64, visitChar, visitInt8, visitString, visitInt32, visitInt32, visitString, visitBool, visitChar, visitFloat32, visitInt64, visitUint8, visitInt64, visitBool, visitInt64, visitInt16, expecting, visitFloat32, visitBytes, visitUint64, visitFloat64, visitUint16, initUnexpectedBool, visitInt8, expecting, visitString, visitNone, visitInt32, visitInt16, visitInt32, visitSome, visitString, expecting, visitUint32, visitBool, visitBytes, initUnexpectedSeq, visitFloat64, visitChar, visitUint64, visitString, visitUint64, visitUint8, visitUint64, visitUint16, visitFloat32, visitInt64, visitSeq, visitUint8, visitUint8, visitInt8, visitInt64, visitUint32, visitBool, visitUint8, visitInt64, visitUint64, visitInt8, visitInt16, visitSome, expecting, visitFloat32, visitInt16, visitInt64, visitInt32, visitString, visitMap, visitNone, deserialize, visitUint16, visitChar, visitFloat64, deserialize, visitBytes, visitFloat64, deserialize, visitUint64, visitString, visitUint8, visitUint8, visitFloat32, deserialize, visitUint64, visitFloat64, visitSome, visitInt16, visitMap, visitSeq, visitNone, visitInt8, visitInt8, visitFloat32, visitInt32, visitBytes, visitSome, visitUint64, visitInt64, visitFloat64, visitFloat32, visitString, visitUint8, visitInt16, visitNone, deserialize, visitSeq, visitSome, initUnexpectedBytes, visitUint64, visitUint32, visitUint16, visitUint16, visitUint64, visitInt32, visitNone, $, expecting, visitFloat64, visitMap, visitSeq, visitInt32, visitSome, visitUint8, visitInt32, visitInt32, visitInt16, visitFloat32, expecting, visitBool, visitString, visitSeq, visitString, visitString, visitInt32, visitInt32, expecting, visitBool, visitUint8, visitUint32, visitUint16, UnexpectedKind, visitInt8, visitBool, visitInt32, visitSeq, visitBool, visitBytes, visitNone, visitInt32, visitMap, raiseUnknownUntaggedVariant, visitString, visitNone, deserialize, visitInt8, deserialize, visitUint16, visitFloat64, visitNone, visitFloat64, visitFloat32, visitUint16, visitBytes, visitUint8, visitChar, visitUint16, visitChar, deserialize, visitUint8, visitInt16, visitUint64, visitSome, visitInt32, visitBytes, visitChar, visitBool, UnknownUntaggedVariant, visitUint64, visitString, initUnexpectedSigned, visitString, visitSeq, visitSome, visitFloat64, visitUint8, visitSome, visitUint32, visitUint16, visitMap, raiseInvalidLength, visitFloat32, visitBool, deserialize, deserialize, visitFloat32, visitUint16, visitUint16, visitInt32, visitUint32, visitSome, visitFloat32, visitUint16, raiseDuplicateField, visitInt64, visitInt8, visitInt8, deserialize, visitFloat32, visitNone, visitSeq, visitBytes, visitInt16, visitInt64, visitFloat64, visitInt64, visitInt64, implDeserializer, visitUint16, visitInt8, visitInt16, visitInt8, visitUint16, visitUint8, visitFloat64, visitUint64, visitInt16, visitUint8, visitSeq, visitInt8, expecting, visitBool, visitInt64, visitFloat32, visitInt8, visitInt16, expecting, visitUint32, visitUint32, visitSeq, visitBool, deserialize, visitUint8, visitSeq, visitInt64, visitMap, visitUint16, visitInt16, visitInt64, implVisitor, visitString, visitUint64, visitBytes, visitMap, visitSome, raiseInvalidValue, visitBytes, visitInt8, visitInt16, visitSeq, visitUint64, visitUint32, visitInt8, visitInt64, visitInt8, visitFloat64, visitChar, visitInt8, expecting, visitUint8, visitNone, deserialize, visitBool, visitMap, expecting, visitBytes, visitUint16, expecting, visitBytes, visitInt64, visitUint32, visitInt64, expecting, visitUint32, visitSeq, visitUint64, visitBytes, visitBytes, visitFloat32, visitUint32, visitFloat64, visitSome, initUnexpectedString, visitInt8, visitBool, visitInt8, visitNone, visitInt16, visitUint32, visitMap, visitUint8, visitUint16, IgnoredAny, expecting, visitUint32, visitMap, visitUint16, visitSeq, visitUint16, visitInt32, visitUint16, visitInt16, visitFloat64, visitInt64, visitString, visitBool, visitFloat32, deserialize, visitInt8, implSeqAccess, visitInt8, visitUint16, visitNone, visitChar, visitUint8, visitMap, visitInt16, visitFloat32, visitNone, visitFloat64, visitInt16, visitInt32, deserialize, visitInt32, visitInt8, visitMap, visitMap, visitInt8, visitUint16, visitChar, visitNone, visitChar, visitFloat64, visitBool, visitString, visitInt8, visitInt16, implDeserializer, visitFloat64, visitInt16, expecting, visitSeq, deserialize, visitInt64, visitNone, visitBytes, visitUint64, visitInt8, visitChar, visitUint8, visitUint64, expecting, visitBytes, visitInt16, visitUint32, MissingField, visitInt16, visitUint8, initUnexpectedOption, visitInt64, visitFloat32, visitInt16, visitChar, visitFloat32, visitInt16, visitInt8, visitInt8, visitUint8, visitNone, visitChar, visitNone, serialize, serialize, serialize, serialize, serialize, makeSerializable, implSerializeArray, serialize, implSerializeSeq, serialize, serialize, serialize, asAddr, serialize, serialize, implSerializeStruct, serialize, serialize, implSerializeMap, serialize, implSerializer, deserialize, deserialize, UnixTimeFormat, serialize, DateTimeWith, serialize