Essential C# Binary Serialization  Suggest an edit

Controlling serialization behavior with attributes

If you use the [NonSerialized] attribute, then that member will always have its default value after deserialization (ex. 0 for an int, null for string, false for a bool, etc.), regardless of any initialization done in the object itself (constructors, declarations, etc.). To compensate, the attributes [OnDeserializing] (called just BEFORE deserializing) and [OnDeserialized] (called just AFTER deserializing) together with their counterparts, [OnSerializing] and [OnSerialized] are provided.

Assume we want to add a “Rating” to our Vector and we want to make sure the value always starts at 1. The way it is written below, it will be 0 after being deserialized:

public class Vector
    public int X;
    public int Y;
    public int Z;

    public decimal Rating = 1M;

    public Vector()
        Rating = 1M;

    public Vector(decimal initialRating)
        Rating = initialRating;

To fix this problem, we can simply add the following method inside of the class to set it to 1:

void OnDeserializing(StreamingContext context)
    Rating = 1M;

Or, if we want to set it to a calculated value, we can wait for it to be finished deserializing and then set it:

void OnDeserialized(StreamingContext context)
    Rating = 1 + ((X+Y+Z)/3);

Similarly, we can control how things are written out by using [OnSerializing] and [OnSerialized].

Table Of Contents
22 Enum
107 Stream
108 Timers
123 Binary Serialization
  ↑ ↓ to navigate     ↵ to select     Esc to close