Skip to content

Turn skip_field into a skip_field_if_possibleΒ #2012

@Manishearth

Description

@Manishearth

Currently, skip_field on SerializeStruct is expected to unconditionally skip the field.

Unfortunately, this is not possible for all serialization formats, e.g. bincode, and this leads to issues like #1732, which is currently WONTFIX since serde does not wish to add further toggles.

This means that the status quo is that skip_serializing_if should only ever be used by end user crates (not libraries wishing to provide more efficient serialization, because then they can't be used with a class of deserializer). This is suboptimal and is a bit of a footgun.

Ideally, all libraries can use this feature without having to worry about it. Perhaps a path forward is to turn skip_field into skip_field_if_possible and give it the same signature as serialize_field. serde-json, etc, can continue to implement SerializeStruct without any modifications since they use the default. bincode can write skip_field_if_possible to forward to serialize_field, i.e. it can choose to never skip a field.

A downside is that the footgun still remains in a smaller form where if skip_serializing_if was used by a crate author because calling .serialize() on the field would panic (or do something bad); and with this change we're tweaking the guarantee of skip_serializing_if

I have a patch with this feature in https://github.com/serde-rs/serde/compare/master...Manishearth:skip-if-possible?expand=1

This would be a breaking change since serde-derive and serde would have to be updated in tandem, and any manual implementors (I doubt there are many) of skip_field would have to update it.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions