Skip to content

Shorten $type tag in common scenario where all cases are in same namespace #527

@lihaoyi

Description

@lihaoyi

Given

package foo

sealed trait Bar
case class Qux() extends Bar
case class Baz() extends Bar

We currently serialize Qux() and Baz() to

{"$type": "foo.Qux"}
{"$type": "foo.Baz"}

We should instead serialize them to

{"$type": "Qux"}
{"$type": "Baz"}

As long as all the cases of the sealed trait are in the same namespace (foo above), using the short name is safe.

It also has several advantages: it is easier to read, results in more compact JSON, and is more stable in case the pacakge foo gets renamed to foo2.

The serialization would still be broken if e.g. Baz got moved into package sub{ case class Baz() }, but that is (a) already the case today and (b) this is sufficiently uncommon a refactor that it's probably not worth worrying about

This would be a breaking change in the serialization format and would need to wait for upickle 4.0.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    compat-breakerThis PR is good to merge, but breaks compatibility and needs to wait till we prepare a major release

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions