Skip to content

serde-ml/serde

Folders and files

NameName
Last commit message
Last commit date

Latest commit

eb757e5 · Oct 1, 2024

History

97 Commits
Apr 23, 2024
Oct 1, 2024
Feb 15, 2024
Jul 3, 2024
Mar 20, 2024
Apr 3, 2024
Nov 14, 2022
Apr 12, 2024
Feb 25, 2024
Aug 21, 2023
Apr 12, 2024
Apr 12, 2024
Apr 3, 2024
Jul 3, 2024
Apr 7, 2024
Apr 12, 2024
Apr 12, 2024

Repository files navigation

serde.ml

A serialization framework for OCaml inspired by serde-rs.

The main goals for serde.ml are:

  • Serialization -- take arbitary data structures from the user and turn them into specific formats with maximum efficiency.

  • Deserialization -- read arbitrary data that you parse into data structures of the user's choice with maximum efficiency.

type rank = Captain | Chief_petty_officer [@@deriving serialize, deserialize]
type t = { name : string; rank : rank } [@@deriving serialize, deserialize]

let obrien = { name = "Miles O'Brien"; rank = Chief_petty_officer }
let sisko = { name = "Benjamin Sisko"; rank = Captain }

> Serde_json.to_string_pretty (serialize_t) obrien
Ok "{ \"name\": \"Miles O'Brien\", \"rank\": \"Chief_petty_officer\" }"

> Serde_json.of_string (deserialize_t) "{ \"name\": \"Miles O'Brien\", \"rank\": \"Chief_petty_officer\" }"
Ok {name = "Miles O'Brien"; rank = Chief_petty_officer}

> Serde_sexpr.to_string_pretty (serialize_t) obrien;;
Ok "(\"Miles O'Brien\" :Chief_petty_officer)"

> Serde_sexpr.of_string (deserialize_t) "(\"Miles O'Brien\" :Chief_petty_officer)";;
Ok {name = "Miles O'Brien"; rank = Chief_petty_officer}

Installation

To install serde from opam, use:

; opam install serde serde_derive serde_json -y

To install serde from sources, use:

; opam pin serde.0.0.2 git+https://github.com/serde-ml/serde -y
; opam pin serde_derive.0.0.2 git+https://github.com/serde-ml/serde -y
; opam pin serde_json.0.0.2 git+https://github.com/serde-ml/serde -y

Usage

To derive deserialize/serialize functions for your data types, make sure to

  • include the serde library
  • include (preprocess (pps serde_derive)) in your library config
  • include any of the formats you want to use (like serde_json)

Now you can add @@deriving annotations to your types:

type rank = Captain | Chief_petty_officer [@@deriving serialize, deserialize]
type t = { name : string; rank : rank } [@@deriving serialize, deserialize]

And use them with the formats:

Serde_json.to_string serialize_rank { name = "Benjamin Sisko"; rank = Captain }

Contributing

Check the CONTRIBUTING.md for a small guide on how to implement new data formats.