zoukankan      html  css  js  c++  java
  • Json.net说法——(三)回调方法修饰标签

    序列化回调方法修饰标签

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

     

     

     

     

  • 相关阅读:
    HDU 1097 a hard puzzle
    HDU 4588 Count The Carries
    不想用锐捷怎么办?锐捷出问题|锐捷不能用怎么办?用menohust代替吧
    线段树及其变种的相关资料(不定期更新)
    UVa 10075
    UVa 1301
    UVa 10256
    UVa 1453
    计算几何相关资料+题目推荐(不定期补充)
    UVa 11524
  • 原文地址:https://www.cnblogs.com/jams742003/p/1631900.html
Copyright © 2011-2022 走看看