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/

转载请注明:博客园

目录
相关文章
|
9月前
|
JSON 前端开发 JavaScript
ES6类的使用和定义.Json.Promise对象的使用
ES6类的使用和定义.Json.Promise对象的使用
75 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 属性设置的值”。
2979 0
|
JSON 数据格式
将JSON字符串反序列化为指定的.NET对象类型
将JSON字符串反序列化为指定的.NET对象类型
183 0
|
JSON 开发框架 算法
.Net 序列化枚举为字符串
我所做的项目是需要调用业务算法的,算法中有一个入参是油品的性质,这个性质有名称、编码、类型等属性,其中类型是固定质量性质、体积性质和其他性质这三种,所以我把其作为枚举类型。问题也由此产生,默认情况下,枚举是以其整数形式进行 JSON 序列化,这就需要同研发算法的同事约定好数值的含义。但是经过协商,算法同事要求我们传递成字符串。因此,我们希望它们在一些情况下以字符串的形式进行序列化。本文将讲解实现这一目标的各种方法。
|
JSON 数据格式
艾伟_转载:使用.NET框架自带的Json序列化类
主要用到的类:DataContractJsonSerializer,该类被申明在System.Runtime.Serialization.Json命名空间下,而System.Runtime.Serialization.
808 0
|
JavaScript 前端开发 .NET
一起谈.NET技术,在Silverligh中调用Javascript (四种调用方法+简单与复杂参数的传递)
  在本文我们将一起学习如何在Silverlight后台代码中调用javascritp脚本。Silverlight中内置了对于HTML、客户端脚本等的支持。很多情况下,我们编写的Web应用程序中用了一些JavaScript或者AJAX框架,我们可以在Silverlight调用某些脚本方法,或者说在Silverlight中触发某个脚本的执行。
864 0
|
JSON 数据格式
.NET读取json数据并绑定到对象
原文:.NET读取json数据并绑定到对象 需要引用的命名空间:       读取的具体应用: this代表本实体(对象),通过PopulateObject,直接将读取到的json数据与对象进行绑定       Json保存的具体应用: 将对象保存为Json     JOb...
876 0
|
存储 Java 索引
.NET面试题解析(04)-类型、方法与继承
转自:http://www.cnblogs.com/anding/p/5248973.html  常见面试题目: 1. 所有类型都继承System.Object吗? 2. 解释virtual、sealed、override和abstract的区别 3. 接口和类有什么异同? 4. 抽象类和接口有什么区别?使用时有什么需要注意的吗? 5. 重载与覆盖的区别? 6. 在继承中new和override相同点和区别?看下面的代码,有一个基类A,B1和B2都继承自A,并且使用不同的方式改变了父类方法Print()的行为。
1101 0
|
JSON JavaScript 前端开发
.NET 构造Class返回多个json值
  上次总结使用DataTable返回多个值,后来看到一个小哥的返回方式和我的有所不同,便留意了一下。原来他构造一个Class,而我构造的是一个Table。   首先说说两者的区别:拿student举例,student1有学号,姓名,成绩,student2,student3...都有该属性。
950 0