I do think (De)Serialize are the only traits/interfaces I’ve ever encountered that always need to know about all the fields in a type in order to be implemented correctly.
There are traits that usually need to know about all or most of the fields in a type, but I believe those are mostly the Debug/Eq/Ord/etc traits in std, and that’s why they’re also on the “always implement if possible” list.
afaik, it’s extremely rare for any other trait implementation to need to operate on the type on a “field by field basis” to achieve basic correctness, and just about every other trait can get away with the type’s public API (if it makes any sense to implement that trait for that type). Maybe I’m missing something important, but that is the impression I get from the current state of Rust and all these other languages we’ve mentioned.
So, personally, I think what we really need to make progress on this issue is more concrete examples of very specific use cases not involving Serialize where “just use a newtype” didn’t work.
The only one I’ve heard of personally was a comment (maybe by @sgrif?) that diesel-chrono should be a thing that exists, but it wouldn’t make sense for diesel or chrono to depend on each other in order to provide those impls. If it turns out that all use cases are similar to this one, perhaps we could brainstorm some sort of whitelisting mechanism where diesel and chrono both declare that diesel-chrono has special permission to impl their items.