I thought you contacted Serializable , but you did not:
All public and private fields in a type marked with SerializableAttribute are serialized by default, unless the type implements the ISerializable interface to override the serialization process.
and
Apply the SerializableAttribute attribute, even if the class also implements the ISerializable interface [...]
That is, the Serializable attribute indicates that this type can be serialized. ISerializable indicates that this type wants to control how this type is serialized.
Or, in other words, your question is not formulated correctly. SerializableAttribute must always be applied (to serializable classes) and is the "base" level of serialization. ISerializable adds more (letting you write code to control the process).
source share