There's subtlety involved in doing this so I've just dumped this out from another document in case I ever need to remember what they were in the future.
The Visit trait can be treated like a lightweight subset of serde::Serialize that can interoperate with serde, without necessarily depending on it. It can't be implemented manually:
/// A type that can be converted into a borrowed value.