Json.Net支持序列化回调方法,回调方法通过Json序列化器(JsonSerializer)可以用来操作一个对象,在它被序列化和反序列化之前或者之后.
OnSerializing
OnSerialized
OnDeserializing
OnDeserialized
为了告诉序列化器在对象的序列化生命周期中哪个方法应该被调用,需要用适当的attribute(OnSerializingAttribute, OnSerializedAttribute, OnDeserializingAttribute, OnDeserializedAttribute)来标记方法.
例如对象序列化的回调方法:
using Newtonsoft.Json;
using System.Runtime.Serialization;
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.";
}
}
示例对象被序列化和反序列化:
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);
Console.WriteLine(json);
// "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.