zoukankan      html  css  js  c++  java
  • C#序列化

      记得最开始的时候,刚一听说到“序列化”这个词的时候,哇。。。好高深。。。应该是什么很难懂的东西吧。。。想想过去的时候,觉得挺好笑的。虽然现在技术也不怎么滴,但是对于序列化也已经没有当初的那种“恐惧”了。。。

      序列化的方法,就我知道的有三种:

      (1)二进制序列化【二进制序列化是通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下。】

      (2)XML序列化 【XML序列化是通过XmlSerializer 类来实现的, 这个类位于System.Xml.Serialization命名空间下。】

      (3)SOAP序列化【SOAP序列化是通过SoapFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Soap命名空间下,并且需要注意需要手动添加对这个命名空间的引用,如图所示

      

     】

    由于SoapFormatter类在.net3.5开始已经过时了,微软建议使用BinaryFormatter类来序列化和反序列化,所以我只写BinaryFormatter方法来序列化。

    编写一个类用来序列化与反序列化:

    [Serializable]      //在需要序列化的类上加上[Serializable]
    class MySerializ
    {
    // [NonSerialized] //如果不想序列化某一个字段,加上[NonSerialized]
    private string _name;
    private string _address;

    public string Name
    {
    get { return _name; }
    set { _name = value; }
    }

    public string Address
    {
    get { return _address; }
    set { _address = value; }
    }

    public override string ToString()
    {
    return "姓名:" + this._name + "...住址:" + this._address;
    }
    }

    序列化和反序列化方法:

    /// <summary>
    /// 二进制序列化
    /// </summary>
    public static void BinarySerializ(MySerializ mySerializ)
    {
    using (FileStream stream = new FileStream(@"D:\test.dat", FileMode.Create, FileAccess.Write))
    {
    BinaryFormatter binary = new BinaryFormatter();
    binary.Serialize(stream, mySerializ);
    Console.WriteLine("已经序列化。。。");
    Console.WriteLine("");
    Console.WriteLine("");
    Console.WriteLine("");
    }
    }

    /// <summary>
    /// 二进制反序列化
    /// </summary>
    public static void BinaryDeserializ(string fileName)
    {
    using (FileStream stream = new FileStream(fileName,FileMode.Open,FileAccess.Read))
    {
    BinaryFormatter binary = new BinaryFormatter();
    MySerializ mySerializ = (MySerializ)binary.Deserialize(stream);
    Console.WriteLine(mySerializ.ToString());
    }
    }

    完整代码

    class Program
    {
    static void Main(string[] args)
    {
    MySerializ mySerializ = new MySerializ();
    mySerializ.Name = "kelei";
    mySerializ.Address = "中国";

    //二进制序列化
    try
    {
    BinarySerializ(mySerializ);
    string path = @"D:\test.dat";
    BinaryDeserializ(path);
    }
    catch (Exception ex)
    {
    Console.WriteLine(ex.Message);
    }

    }
    /// <summary>
    /// 二进制序列化
    /// </summary>
    public static void BinarySerializ(MySerializ mySerializ)
    {
    using (FileStream stream = new FileStream(@"D:\test.dat", FileMode.Create, FileAccess.Write))
    {
    BinaryFormatter binary = new BinaryFormatter();
    binary.Serialize(stream, mySerializ);
    Console.WriteLine("已经序列化。。。");
    Console.WriteLine("");
    Console.WriteLine("");
    Console.WriteLine("");
    }
    }

    /// <summary>
    /// 二进制反序列化
    /// </summary>
    public static void BinaryDeserializ(string fileName)
    {
    using (FileStream stream = new FileStream(fileName,FileMode.Open,FileAccess.Read))
    {
    BinaryFormatter binary = new BinaryFormatter();
    MySerializ mySerializ = (MySerializ)binary.Deserialize(stream);
    Console.WriteLine(mySerializ.ToString());
    }
    }
    }
    [Serializable] //在需要序列化的类上加上[Serializable]
    class MySerializ
    {
    // [NonSerialized] //如果不想序列化某一个字段,加上[NonSerialized]
    private string _name;
    private string _address;

    public string Name
    {
    get { return _name; }
    set { _name = value; }
    }

    public string Address
    {
    get { return _address; }
    set { _address = value; }
    }

    public override string ToString()
    {
    return "姓名:" + this._name + "...住址:" + this._address;
    }
    }



     

  • 相关阅读:
    iOS事件机制,以及不同手势使用touchesBegan等表现形式
    UIview 动画
    核心动画与UIView
    代理与Block
    关于清除浮动的几个写法
    关于一个自适应屏幕的高宽
    关于loading 的一个css样式
    用margin还是用padding?(3)—— 负margin实战
    jquery回顾part1——选择器
    解读mysql主从配置及其原理分析(Master-Slave)
  • 原文地址:https://www.cnblogs.com/kelei12399/p/2342928.html
Copyright © 2011-2022 走看看