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/

转载请注明:博客园

目录
相关文章
|
6月前
|
JSON 前端开发 JavaScript
ES6类的使用和定义.Json.Promise对象的使用
ES6类的使用和定义.Json.Promise对象的使用
58 0
.NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法
.NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法
170 0
|
JSON 前端开发 数据格式
.net MVC 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值
在.net mvc的controller中,方法返回JsonResult,一般我们这么写: [HttpPost] public JsonResult QueryFeature(string url, string whereClause) { string str=""; return Json(str); }   此时如果str过长,就会报“使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值”。
2935 0
|
JSON 数据格式
将JSON字符串反序列化为指定的.NET对象类型
将JSON字符串反序列化为指定的.NET对象类型
168 0
|
JavaScript 前端开发 .NET
一起谈.NET技术,在Silverligh中调用Javascript (四种调用方法+简单与复杂参数的传递)
  在本文我们将一起学习如何在Silverlight后台代码中调用javascritp脚本。Silverlight中内置了对于HTML、客户端脚本等的支持。很多情况下,我们编写的Web应用程序中用了一些JavaScript或者AJAX框架,我们可以在Silverlight调用某些脚本方法,或者说在Silverlight中触发某个脚本的执行。
856 0
|
API
晚绑定场景下对象属性赋值和取值可以不需要Pro“.NET技术”pertyInfo
  在《一句代码实现批量数据绑定》中,我通过界面控件ID与作为数据源的实体属性名之间的映射实现了批量数据绑定。由于里面频繁涉及对属性的反射——通过反射从实体对象中获取某个属性值;通过反射为控件的某个属性赋值,所以这不是一种高效的操作方式。
793 0
|
API
晚绑定场景下对象属性赋值和取值可以不需要Pro“.NET研究”pertyInfo
  在《一句代码实现批量数据绑定》中,我通过界面控件ID与作为数据源的实体属性名之间的映射实现了批量数据绑定。由于里面频繁涉及对属性的反射——通过反射从实体对象中获取某个属性值;通过反射为控件的某个属性赋值,所以这不是一种高效的操作方式。
825 0
|
API
一起谈.NET技术,晚绑定场景下对象属性赋值和取值可以不需要PropertyInfo
  在《一句代码实现批量数据绑定》中,我通过界面控件ID与作为数据源的实体属性名之间的映射实现了批量数据绑定。由于里面频繁涉及对属性的反射——通过反射从实体对象中获取某个属性值;通过反射为控件的某个属性赋值,所以这不是一种高效的操作方式。
995 0
|
JavaScript 前端开发 .NET
在Silverligh中调用J“.NET研究”avascript (四种调用方法+简单与复杂参数的传递)
  在本文我们将一起学习如何在Silverlight后台代码中调用javascritp脚本。Silverlight中内置了对于HTML、客户端脚本等的支持。很多情况下,我们编写的Web应用程序中用了一些JavaScript或者AJAX框架,我们可以在Silverlight调用某些脚本方法,或者说在Silverlight中触发某个脚本的执行。
1137 0
|
JSON 数据格式
.NET读取json数据并绑定到对象
原文:.NET读取json数据并绑定到对象 需要引用的命名空间:       读取的具体应用: this代表本实体(对象),通过PopulateObject,直接将读取到的json数据与对象进行绑定       Json保存的具体应用: 将对象保存为Json     JOb...
860 0