deser

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.

Note: This is a mandatory step. The generated procedures will then be used by parsers.

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: ...

Note: Out of the box, deser supports serialization of many types from the standard library. However, some types, such as Time, cannot be unambiguously serialized. Therefore, the user must explicitly specify how to serialize such types.

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)

Note: Since deser 0.3.2 you can use the helpers module and deserWith pragma for convenient time de/serialization.

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

Supported formats

How to make bindings

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.

Note: This section of the documentation is being supplemented.

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