This is actually quite subtle...
On the surface, the answer is simply "it adds the SerializableAttribute
to the metadata for the class", where the purpose of SerializableAttribute
is to advertise (to things like BinaryFormatter
) that a type can be serialized. BinaryFormatter
will refuse to serialize things that aren't explicitly advertised for serialization. This may be a consequence of BinaryFormatter
being used to implement remoting, and to prevent data accidentally leaking across a remoting boundary.
Note that most serializers don't care about SerializableAttribute
, so this only impacts things like BinaryFormatter
. For example, none of XmlSerializer
, DataContractSerializer
, JavaScriptSerializer
, JSON.NET or protobuf-net really care about SerializableAttribute
.
However, actually, it is not a standard attribute, but has special handling by the compiler:
- most attributes are technically
.custom instance
values (in IL terms)
- however,
SerializableAttribute
actually maps to a CLI .class
flag, serializable
This doesn't change the meaning, but : as a novelty fact, SerializableAttribute
is not actually implemented as an attribute.