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

简介: 序列化回调方法修饰标签 json.net支持序列化回调方法标签。一个回调修饰标签可以在序列化和反序列化对象前后控制对象。   OnSerializing OnSerialized OnDeserializing OnDeserialized   通知序列化器在对象的序列化生命周期内要调用哪些方法,并用适合的标签来修饰方法(序列化时,序列化后,反序列化时,反序列化后)。

序列化回调方法修饰标签

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

 

 

 

 

博客园大道至简

http://www.cnblogs.com/jams742003/

转载请注明:博客园

目录
相关文章
|
2月前
|
SQL 缓存 开发框架
分享一个 .NET EF6 应用二级缓存提高性能的方法
分享一个 .NET EF6 应用二级缓存提高性能的方法
|
2月前
|
JSON JavaScript 前端开发
JavaScript实现字符串转json对象的方法
JavaScript实现字符串转json对象的方法
|
9天前
|
XML JSON JavaScript
JSON对象的stringify()和parse()方法使用
本文阐述了JSON对象的`stringify()`和`parse()`方法的用法,包括如何将JavaScript对象转换为JSON字符串,以及如何将JSON字符串解析回JavaScript对象,并讨论了转换过程中需要注意的事项。
JSON对象的stringify()和parse()方法使用
|
2月前
|
存储 JSON JavaScript
|
2月前
|
程序员 数据库
分享 2 个 .NET EF 6 只更新某些字段的方法
分享 2 个 .NET EF 6 只更新某些字段的方法
|
2月前
|
数据库
分享一个 .NET EF 6 扩展 Where 的方法
分享一个 .NET EF 6 扩展 Where 的方法
|
2月前
|
开发框架 前端开发 算法
分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法
分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法
|
2月前
|
开发框架 中间件 .NET
分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法
分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法
|
2月前
|
开发框架 .NET API
如何在 ASP.NET Core Web API 方法执行前后 “偷偷“ 作一些 “坏“ 事?初识 ActionFilterAttribute
如何在 ASP.NET Core Web API 方法执行前后 “偷偷“ 作一些 “坏“ 事?初识 ActionFilterAttribute
|
2月前
|
开发框架 前端开发 .NET
Asp.net Webapi 的 Post 方法不能把参数加到 URL 中?试试这样写
Asp.net Webapi 的 Post 方法不能把参数加到 URL 中?试试这样写