jcrist / msgspec

A fast serialization and validation library, with builtin support for JSON, MessagePack, YAML, and TOML
https://jcristharif.com/msgspec/
BSD 3-Clause "New" or "Revised" License
2.44k stars 75 forks source link

Support adding hooks for supported objects types #671

Open mike0sv opened 7 months ago

mike0sv commented 7 months ago

Description

Right now, dec_hooks and enc_hooks are called only if msgspec encounters unknown type. I'd like a way to override dec/enc logic for specific supported types, but there is no way to do it rn. Possible solutions:

  1. add new argument with Dict[Type[T], Callable[[T], Any] that works even if T is subclass of Struct or any other supported type
  2. inspect argument type annotation for callables passed to dec_hooks and enc_hooks. If it is annotated with some type, use hook even if type supported natively
  3. introduce special (possibly dunder method) that can override default enc/dec logic. It can look something like this in python: decoded = if hasattr(obj.__class__, "__decode__") obj.__decode__(obj) else <native logic>. This will only work for Struct subclasses though
wikiped commented 7 months ago

Linked: #669

kevin-lee-dialpad commented 6 months ago

we have the same problem. msgspec json encoder supports a lot more types by default which sometimes isn't what we want(ex. sometimes we'd rather have serialization to fail rather than letting it pass and create an encoded data that we wouldn't know what type to decode it to by the time it gets to deserialization step). and sometimes the way that msgspec json serializes certain supported types just isn't what we want.

both of these issues can be dealt with if there's a way to override behaviour for certain supported types.