序列化回调方法修饰标签
json.net支持序列化回调方法标签。一个回调修饰标签可以在序列化和反序列化对象前后控制对象。
OnSerializing
OnSerialized
OnDeserializing
OnDeserialized
通知序列化器在对象的序列化生命周期内要调用哪些方法,并用适合的标签来修饰方法(序列化时,序列化后,反序列化时,反序列化后)。
参考类:Customer
public class Customer
{
//在序列化前后没有变动
public int Unid { get; set; }
//在序列化前后设置和重置
public string CustomerName { get; set; }
//设置为null,但在序列化后填充
public string Memo { get; set; }
//忽略序列化,OnDeserializedAttribute标签用于序列化之后设置一个值
[JsonIgnore]
public string Other { get; set; }
public Customer()
{
Unid = 11;
CustomerName = "宋江";
Other = "忽略序列化";
Memo = null;
}
[OnSerializing]
internal void OnSerializingMethod(StreamingContext context)
{
CustomerName = "在序列化时被写入数据文件";
}
[OnSerialized]
internal void OnSerializedMethod(StreamingContext context)
{
CustomerName = "序列化之后被赋值";
}
[OnDeserializing]
internal void OnDeserializingMethod(StreamingContext context)
{
Other = "反序列化时被赋值";
}
[OnDeserialized]
internal void OnDeserializedMethod(StreamingContext context)
{
Memo = "反序列化之后,被赋值";
}
}
这个.net类有4个属性:
·Unid,在序列化前后值没有变化,且值不为null
·CustomerName,在序列化前后赋值和重设值
·Memo,给null值
·Other,这个属性忽略序列化。
public void SerializeCallbacks()
{
Customer customer = new Customer();
Console.WriteLine(customer.Unid);
Console.WriteLine(customer.CustomerName);
Console.WriteLine(customer.Memo);
Console.WriteLine(customer.Other);
/*
11
宋江
忽略序列化
*/
string json = JsonConvert.SerializeObject(customer, Formatting.Indented);
Console.WriteLine(json);
/*
{"Unid": 11,"CustomerName": "在序列化期间被写入数据文件", "Memo": null}
*/
Console.WriteLine(customer.Unid);
Console.WriteLine(customer.CustomerName);
Console.WriteLine(customer.Memo);
Console.WriteLine(customer.Other);
/*
11
序列化之后被赋值
忽略序列化
*/
}
分析:
(1)在没有序列化时的值
11
宋江
忽略序列化
输出4个属性的值,其中Memo值为null
(2)序列化之后
{"Unid": 11,"CustomerName": "在序列化期间被写入数据文件", "Memo": null}
·Unid在序列化之前和之后没有变化
·CustomerName,在序列化之前设置为“宋江”,但序列化之后变成了
“在序列化期间被写入数据文件”([OnSerializing])
·Memo为null值
·Other属性被忽略
序列化之后,Customer对象的值:
11
序列化之后被赋值
忽略序列化
·Unid没有变化
·CustomerName,序列化之后,被重新设置值“序列化之后被赋值”( [OnSerialized])
·Other,忽略序列化,值没有变动
(2)反序列化
接上
string json = JsonConvert.SerializeObject(customer, Formatting.Indented);
之后:
customer = JsonConvert.DeserializeObject<Customer>(strJson);
Console.WriteLine(customer.Unid);
Console.WriteLine(customer.CustomerName);
Console.WriteLine(customer.Memo);
Console.WriteLine(customer.Other);
/*
11
在序列化时被写入数据文件
反序列化之后,被赋值
反序列化时被赋值 */
·Unid没有变化
·CustomerName在序列化时,被赋值“在序列化期间被写入数据文件”写到数据文件(生成了json),即json对象中的CustomerName值为“在序列化期间被写入数据文件”,在反序列化之后,得到了CustomerName属性为这个值的对象
·Memo在反序列化之后被赋值为“反序列化之后,被赋值” [OnDeserialized]标签
·Other属性在序列化时是被忽略的,而即使这样,因为[OnDeserializing]标签的作用,使它在反序列化时被设定值“反序列化时被赋值”