package ppx_protocol_conv

  1. Overview
  2. Docs
Ppx for generating serialisation and de-serialisation of ocaml types.


Dune Dependency






Ppx_protocol_conv generates code to serialise and de-serialise types. The ppx itself does not contain any protocol specific code, but relies on 'drivers' that defines serialisation and de-serialisation of basic types and structures.

Pre-defined drivers are available in separate packages: ppx_protocol_conv_json (Yojson.Safe.json) ppx_protocol_conv_msgpack (Msgpck.t)(Xml.xml) ppx_protocol_conv_xml-light (Xml.xml) ppx_protocol_conv_yaml (Yaml.t)

Published: 28 Mar 2018


Ppx Protocol Conv

Ppx protocol conv (de)serialisers using deriving, which allows for plugable (de)serialisers.

Example Usage

open Protocol_conv
open Protocol_conv_json
type a = {
  x: int;
  y: string [@key "Y"]
} [@@deriving protocol ~driver:(module Json) ~flags:(`Mangle Json.mangle)]

type b = A of int
       | B of int [@key "b"]
       | C
[@@deriving protocol ~driver:(module Json)]

will generate the functions:

val a_to_json: a -> Json.t
val a_of_json: Json.t -> a

val b_to_json: a -> Json.t
val b_of_json: Json.t -> a
a_to_json { x=42; y:"really" }

Evaluates to

[ "x", `Int 42; "Y", `String "really"] (* Yojson.Safe.json *)

to_protocol deriver will generate serilization of the type. of_protocol deriver generates de-serilization of the type, while protocol deriver will generate both serilizarion and de-serilization functions.

Flags can be specified using the driver argument ~flags. For the json module, the mangle function transforms record label names to be lower camelcase: a_bc_de -> aBcDe and a_bc_de_ -> aBcDe. Beware that this may cause name collisions, which can only be determined at compile time.


Record label names can be changed using [@key <string>]

Variant constructors names can also be changed using the [@key <string>] attribute.


The ppx also handles signature, but disallows [@key ...] and ~flags:... as these does not impact signatures.


The protocol deriver implements:

  • Json which serializes to Yojson.Safe.t

  • Xml_light which serializes to Xml.xml list

  • Msgpack which serializes to Msgpck.t

Custom drivers

It should be easy to provide custom drivers by implementing the signature:

include Lib.Driver with type t = ... and type flags = ...

See the drivers directory for examples on how to implemented new drivers. Submissions of useful drivers are welcome


The json driver will currently serialize type t option option as t option. This means that Some None and None is both mapped to Null.

Dependencies (7)

  1. ppx_metaquot build
  2. jbuilder >= "1.0+beta9"
  3. ppx_core
  4. ppx_driver
  5. ppx_type_conv
  6. base < "v0.14"
  7. ocaml >= "4.04"

Dev Dependencies (5)

  1. ounit with-test
  2. xml-light with-test
  3. yaml with-test
  4. yojson with-test
  5. msgpck with-test




Innovation. Community. Security.