Controlling serialization behavior with attributes C# with Example



Controlling serialization behavior with attributes C# with Example

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: 
[Serializable] 
public class Vector 
{ 
public int X; 
public int Y; 
public int Z; 
[NonSerialized] 
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: 
[OnDeserializing] 
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: 
[OnDeserialized] 
void OnDeserialized(StreamingContext context) 
{ 
Rating = 1 + ((X+Y+Z)/3); 
} 
Similarly, we can control how things are written out by using [OnSerializing] and [OnSerialized]. 

0 Comment's

Comment Form