Json.Net支持序列化回调方法,回调方法通过Json序列化器(JsonSerializer)可以用来操作一个对象,在它被序列化和反序列化之前或者之后.
为了告诉序列化器在对象的序列化生命周期中哪个方法应该被调用,需要用适当的attribute(OnSerializingAttribute,OnSerializedAttribute,OnDeserializingAttribute,OnDeserializedAttribute)来标记方法.
- 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);
- string temp = obj.Member2
程序的输出结果分别为
json=
{
"Member1": 11,
"Member2": "This value went into the data file during serialization.",
"Member4": null
}
temp = This value was reset after serialization.
可见在充列化的过程中会调用带有[OnSerializing]标签的方法,在序列化完成后调用[OnSerialized]方法.