zoukankan      html  css  js  c++  java
  • .NET中序列化(三)

    导航:

    .NET中序列化(一)

    .NET中序列化(二)

    ----------------------------------------------------------------------------------------------------------------------------

    经过前两章的介绍,我想大家应该对序列化有了一定基础认识了,本节将介绍序列化泛型,和序列化事件

    序列化泛型

    其实泛型和非泛型其实没有什么不同,不过要注意以下两点:

    1.泛型只支持BinaryFormatter格式,不支持SOAP格式

    2.泛型序列化的类型和反序列化的类型要一致,如果把MyClass<int> 类型序列化,你不能反序列化出MyClass<string>类型。

        [Serializable]
    public class MyClass<T>
    {
    public string Name
    {
    get;
    set;
    }
    public int Age
    {
    get;
    set;
    }
    public T MyWork
    {
    get;
    set;
    }
    }

    [Serializable]
    public class Work
    {
    public string Name
    {
    set;
    get;
    }
    public string Address
    {
    set;
    get;
    }
    }


    class Program
    {
    static void Main(string[] args)
    {
    MyClass<Work> my = new MyClass<Work>();
    my.Name = "凤姐";
    my.Age = int.MaxValue;

    Work work = new Work();
    work.Address = "你家隔壁";
    work.Name = "不知道";
    my.MyWork = work;

    //泛型只支持BinaryFormatter格式,不支持SOAP格式
    System.Runtime.Serialization.IFormatter formatter = new BinaryFormatter();

    //创建一个文件流
    Stream stream = new FileStream(@"c:\MyClass.bin", FileMode.Create, FileAccess.Write);

    using (stream)
    {
    //这里就是进行序列化了
    formatter.Serialize(stream, my);
    }
    }
    }


    序列化事件

    序列化事件在命名空间using System.Runtime.Serialization中,事件共分四个,分别是

    OnSerializing:序列化发生之前

    OnSerialized:序列化发生之后

    OnDeserializing:反序列化发生之前

    OnDeserialized:反序列化发生之后

     1     [Serializable]
    2 public class MyClass
    3 {
    4 //数据库连接字符串
    5 string connectionString = "";
    6 [NonSerialized]
    7 SqlConnection conn;
    8 public SqlConnection Conn
    9 {
    10 get
    11 {
    12 return conn;
    13 }
    14 set
    15 {
    16 conn = value;
    17 }
    18 }
    19
    20 public string Name
    21 {
    22 get;
    23 set;
    24 }
    25
    26 public int Age
    27 {
    28 get;
    29 set;
    30 }
    31
    32 [OnSerializing]
    33 void OnSerializing(StreamingContext context)
    34 {
    35 }
    36
    37 [OnSerialized]
    38 void OnSerialized(StreamingContext context)
    39 {
    40 }
    41
    42 [OnDeserializing]
    43 void OnDeserializing(StreamingContext context)
    44 {
    45 }
    46
    47 //因为数据连接不好被序列化,所以反序列化时就为NULL了,我们就应该在反序列化发生之后的事件中人工的实例化数据连接
    48 [OnDeserialized]
    49 void OnDeserialized(StreamingContext context)
    50 {
    51 conn = new SqlConnection(connectionString);
    52 conn.Open();
    53 }
    54
    55 }

    我们利用OnDeserialized属性事件人工完成了SqlConnection的反序列化。

    注意:

    1.事件的签名一定要是 void <方法名>(StreamingContext context)这个样子的,context只有在高级的场景中才用到,现在先不讨论。

    2.最好是把事件方法写成私有的,以避免子类的重载件方法产生异常。

    好了,今天的内容说完了,晕都快12点了,我要洗洗睡了。下节我们将介绍序列化的版本控制。




  • 相关阅读:
    小结:机器学习基础部分
    概率图:HMM:Evaluation问题(前向算法/后向算法)
    概率图:GMM求解:EM优化算法的导出(从【ELBO+KL】和【ELBO+Jensen】两个角度导出)
    概率图:GMM:EM算法及其收敛性证明
    概率图:高斯混合模型(GMM)
    概率图基础:D-separation;全局Markov性质;Markov Blanket
    概率图基础:概率基本概念、条件独立性、图求解联合概率的规则合理性推理
    mysql索引失效
    mysql 统计行数count(*)
    mysql如何收缩表空间
  • 原文地址:https://www.cnblogs.com/lmm0591/p/2184803.html
Copyright © 2011-2022 走看看