Serialization Callbacks

Json.NET

Json.NET - Quick Starts & API Documentation Serialization Callbacks

Json.NET supports serialization callback methods. A callback can be used to manipulate an object before and after its serialization and deserialization by the JsonSerializer.

  • OnSerializing
  • OnSerialized
  • OnDeserializing
  • OnDeserialized

To tell the serializer which methods should be called during the object's serialization lifecycle, decorate a method with the appropraite attribute (OnSerializingAttribute, OnSerializedAttribute, OnDeserializingAttribute, OnDeserializedAttribute).

Example object with serialization callback methods:

public class SerializationEventTestObject
{
  // This member is serialized and deserialized with no change.
  public int Member1 { get; set; }
 
  // The value of this field is set and reset during and 
  // after serialization.
  public string Member2 { get; set; }
 
  // This field is not serialized. The OnDeserializedAttribute 
  // is used to set the member value after serialization.
  [JsonIgnore]
  public string Member3 { get; set; }
 
  // This field is set to null, but populated after deserialization.
  public string Member4 { get; set; }
 
  public SerializationEventTestObject()
  {
    Member1 = 11;
    Member2 = "Hello World!";
    Member3 = "This is a nonserialized value";
    Member4 = null;
  }
 
  [OnSerializing]
  internal void OnSerializingMethod(StreamingContext context)
  {
    Member2 = "This value went into the data file during serialization.";
  }
 
  [OnSerialized]
  internal void OnSerializedMethod(StreamingContext context)
  {
    Member2 = "This value was reset after serialization.";
  }
 
  [OnDeserializing]
  internal void OnDeserializingMethod(StreamingContext context)
  {
    Member3 = "This value was set during deserialization";
  }
 
  [OnDeserialized]
  internal void OnDeserializedMethod(StreamingContext context)
  {
    Member4 = "This value was set after deserialization.";
  }
}

The example object being serialized and deserialized by Json.NET:

SerializationEventTestObject obj = new SerializationEventTestObject();
 
Console.WriteLine(obj.Member1);
// 11
Console.WriteLine(obj.Member2);
// Hello World!
Console.WriteLine(obj.Member3);
// This is a nonserialized value
Console.WriteLine(obj.Member4);
// null
 
string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
// {
//   "Member1": 11,
//   "Member2": "This value went into the data file during serialization.",
//   "Member4": null
// }
 
Console.WriteLine(obj.Member1);
// 11
Console.WriteLine(obj.Member2);
// This value was reset after serialization.
Console.WriteLine(obj.Member3);
// This is a nonserialized value
Console.WriteLine(obj.Member4);
// null
 
obj = JsonConvert.DeserializeObject<SerializationEventTestObject>(json);
 
Console.WriteLine(obj.Member1);
// 11
Console.WriteLine(obj.Member2);
// This value went into the data file during serialization.
Console.WriteLine(obj.Member3);
// This value was set during deserialization
Console.WriteLine(obj.Member4);
// This value was set after deserialization.