Json.Net学习-序列化的回调方法

时间:2021-01-14 23:29:16

 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]方法.