The Serialization category page had no intro, showing only the table with a generic meta description. Co-Authored-By: Claude <noreply@anthropic.com>
2.9 KiB
When your Python serialization library should validate too, msgspec decodes JSON straight into typed objects. Without a schema, orjson is fast and correct.
How to choose:
- Decoding into typed, validated objects: msgspec
- Faster JSON that still gives you dicts and lists: orjson
- Compact binary data other languages can read: msgpack
- Schemas that convert ORM or app objects for a web API: marshmallow
msgspec works as a faster JSON or MessagePack library on its own. Still, its docs recommend it for the full serialization and validation workflow: define your schemas with type annotations, encode them, then decode them back with validation. Structs are the preferred way to define those types. Pass the type when you decode, and msgspec validates while decoding at no added runtime cost: msgspec.json.decode(data, type=User). A consistent interface covers MessagePack, YAML, and TOML too.
Moving from the standard json module to orjson? The largest difference is that orjson.dumps returns bytes, not str. orjson serializes dataclasses, datetimes, and UUIDs natively. Decoding gives you only dicts, lists, and other builtins, and orjson leaves schemas to validation libraries a level above.
msgpack reads and writes MessagePack, a binary format that lets you exchange data among languages like JSON, but faster and smaller. Call packb and unpackb for one-shot use, and read many objects from one stream with an Unpacker. When the data comes from an untrusted source, set max_buffer_size to limit the buffer.
marshmallow makes no assumption about your web framework or database layer, so its schemas work with just about any ORM, or none. Declare a schema as a class that maps attribute names to fields. Its dump method turns your objects into primitive Python types, and load validates and deserializes incoming data, raising ValidationError on invalid input. To get objects back instead of dicts, decorate a schema method with post_load.
orjson, msgspec, and msgpack all pitch speed, but msgspec's own benchmark page encourages you to write your own benchmarks before deciding.