Serialization and Class Hierarchies
When you apply the Serializable attribute to a class, it affects only that class—it doesn’t make any derived classes serializable, because the Inherited property of the AttributeUsage
attribute applied on the Serializable attribute is set to false. For example, if you derive MyClass from MyBaseClass, MyClass isn’t serializable:
[Serializable]
public class MyBaseClass
{}
public class MyClass : MyBaseClass
{}At first glance this may appear awkward, but it does make design sense: MyBaseClass has no way of knowing whether its subclasses will have non-serializable members, so it would be wrong for them to automatically inherit the serializable status. If you design a class hierarchy and you want to support serialization of any type in the hierarchy, be sure to mark each level with the Serializable attribute:
[Serializable]
public class MyBaseClass
{}
[Serializable]
public class MyClass : MyBaseClass
{}
[Serializable]
public class MyOtherClass : MyClass
{}Custom Serialization and Base Classes
If any of the classes in the hierarchy implements ISerializable, there are a few design guidelines you have to follow to allow subclasses to provide their own custom serialization and to correctly manage the custom serialization of the base classes:
Only the topmost base class that uses custom serialization needs to derive from
ISerializable.When using implicit interface implementation, a base class must define its
GetObjectData()method asvirtualto allow subclasses ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access