zoukankan      html  css  js  c++  java
  • Json.Net学习笔记(八) 序列化的回调方法

    Json.Net支持序列化回调方法,回调方法通过Json序列化器(JsonSerializer)可以用来操作一个对象,在它被序列化和反序列化之前或者之后.


    OnSerializing
    OnSerialized
    OnDeserializing
    OnDeserialized

    为了告诉序列化器在对象的序列化生命周期中哪个方法应该被调用,需要用适当的attribute(OnSerializingAttribute, OnSerializedAttribute, OnDeserializingAttribute, OnDeserializedAttribute)来标记方法.

    例如对象序列化的回调方法:

    using Newtonsoft.Json;
    using System.Runtime.Serialization;

     public class SerializationEventTestObject
        {
            // This member is serialized and deserialized with no change.
            public int Member1 { get; set; }
            // The value of this field is set and reset during and
            // after serialization.
            public string Member2 { get; set; }
            // This field is not serialized. The OnDeserializedAttribute
            // is used to set the member value after serialization.
            [JsonIgnore]
            public string Member3 { get; set; }
            // This field is set to null, but populated after deserialization.
            public string Member4 { get; set; }
            public SerializationEventTestObject()
            {
                Member1 = 11;
                Member2 = "Hello World!";
                Member3 = "This is a nonserialized value";
                Member4 = null;
            }
            [OnSerializing]
            internal void OnSerializingMethod(StreamingContext context)
            {
                Member2 = "This value went into the data file during serialization.";
            }
            [OnSerialized]
            internal void OnSerializedMethod(StreamingContext context)
            {
                Member2 = "This value was reset after serialization.";
            }
            [OnDeserializing]
            internal void OnDeserializingMethod(StreamingContext context)
            {
                Member3 = "This value was set during deserialization";
            }
            [OnDeserialized]
            internal void OnDeserializedMethod(StreamingContext context)
            {
                Member4 = "This value was set after deserialization.";
            }
        }

    示例对象被序列化和反序列化:

     SerializationEventTestObject obj = new SerializationEventTestObject();
                Console.WriteLine(obj.Member1);// 11
                Console.WriteLine(obj.Member2);// Hello World!
                Console.WriteLine(obj.Member3);// This is a nonserialized value
                Console.WriteLine(obj.Member4);// null
                string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
                Console.WriteLine(json);

                //{
                //  "Member1": 11,
                //  "Member2": "This value went into the data file during serialization.",
                //  "Member4": null
                //}

     

                Console.WriteLine(obj.Member1);//11
                Console.WriteLine(obj.Member2);// This value was reset after serialization.
                Console.WriteLine(obj.Member3);// This is a nonserialized value
                Console.WriteLine(obj.Member4);// null

                obj = JsonConvert.DeserializeObject<SerializationEventTestObject>(json);
                Console.WriteLine(obj.Member1);//11
                Console.WriteLine(obj.Member2);// This value went into the data file during serialization.
                Console.WriteLine(obj.Member3);// This value was set during deserialization
                Console.WriteLine(obj.Member4);// This value was set after deserialization.

  • 相关阅读:
    蚂蚁森林自动收能量
    え速记
    い 速记
    あ速记
    五十音图
    Leetcode 215. 数组中的第K个最大元素 排序 优先队列
    动手学深度学习 | 第二部分完结竞赛:图片分类 | 29
    动手学深度学习 | 残差网络 ResNet | 27
    动手学深度学习 | 批量归一化 | 26
    动手学深度学习 | 含并行连结的网络GoogLeNet/Inception V3 | 25
  • 原文地址:https://www.cnblogs.com/q28633999/p/2078390.html
Copyright © 2011-2022 走看看