Json.net说法——(三)回调方法修饰标签

本文介绍使用JSON.NET进行对象序列化和反序列化时如何利用回调方法修饰标签控制对象的状态。通过实例展示如何使用OnSerializing、OnSerialized、OnDeserializing及OnDeserialized等标签在序列化过程中调整对象属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

序列化回调方法修饰标签

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]

·Memonull


·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]标签的作用,使它在反序列化时被设定值反序列化时被赋值

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值