[★].NET 使用 二进制格式 进行序列化

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
namespace CSharpTest
{
    /// <summary>
    ///
    ///  序列化的优点
    ///  以某种方式存储形式使自定义对象能持久化;
    ///  能方便地 将对象传递到另外一个地方
    ///
    ///  序列化的实质是将类的值转化为一个一般的(即连续的)字节流,然后可以将流写入到磁盘文件或任何其他可以进行流(Strean)化的目标上
    ///  要想实际的写出这个流,就要使用那些实现了IFormatter 接口的类理的Serialize 和 Deserialize 方法
    ///
    /// .NET 框架中提供了两个类,一个是BinaryFormatter类,另外一个是SoapFormatter类.
    ///  BinaryFormatter 类使用二进制格式进行序列化,而SoapFormatter 类使用XML 格式进行序列化.
    ///
    ///  要使用BinaryFormater 类,只需要创建一个要使用的流的实例和一个序列化类的实例
    ///  流的实例和要序列化的对象实例作为参数提供给此方法调用.类中所有的成员变量(包括标记为private 的变量)都将被序列化.
    ///  注意的是能被序列化的类,必须在类的声明之前加上[Serializable()]标志
    ///

    /// </summary>
   
    //namespace CSharpTest
    //{
    //    [Serializable()]
    //    class Class2
    //    {

    //        private string _userName = string.Empty;
    //        public string UserName
    //        {
    //            get
    //            {
    //                return _userName;
    //            }
    //            set
    //            {
    //                _userName = value;
    //            }
    //        }
    //        public string kk()
    //        {
    //            return "出来!";
    //        }
    //    }
    //}
     //private void button3_Click(object sender, EventArgs e)
     //   {
     //       Class2 cls=new Class2();
     //       cls.UserName = "我刚刚负的值";

     //       SerializationHelper.Serialize(cls,"f:\\1.txt");
     //       MessageBox.Show("成功");
          
     //   }

     //   private void button4_Click(object sender, EventArgs e)
     //   {
     //       Class2 cls=(Class2)SerializationHelper.Deserialize("f:\\1.txt");

     //       MessageBox.Show(cls.UserName.ToString());
     //       MessageBox.Show(cls.kk().ToString());
     //   }
    public class SerializationHelper
    {
        //静态方法Serialize,将一个对象序列化为一个文件
        public static void Serialize(object data, string filePath)
        {   try
            {
                //打开文件
                StreamWriter fs = new StreamWriter(filePath, false);
                try
                {
                    // 创建其支持存储区为内存的流
                    MemoryStream streamMemory = new MemoryStream();
                    // 以二进制格式将对象或整个连接对象图形序列化或反序列化
                    BinaryFormatter formater = new BinaryFormatter();
                    //将这个对象序列化到内存流中
                    formater.Serialize(streamMemory, data);
                    //先转换为字符串的形式
                    string binaryData = Convert.ToBase64String(streamMemory.GetBuffer());
                  
                    //将数据 写入到文件
                    fs.Write(binaryData);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    fs.Flush();
                    fs.Close();
                }
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }
        // 反序列化,从文件序列化一个对象
        public static object Deserialize(string filePath)
        {
            object data = new object();
            try
            {
                //打开文件
                StreamReader sr = new StreamReader(filePath);
                try
                {
                    MemoryStream streamMemory;
                    BinaryFormatter formatter = new BinaryFormatter();
                    //以字符串的形式读取数据
                    string cipherData = sr.ReadToEnd();

                    byte [] binaryData=Convert.FromBase64String(cipherData);
                    //反序列化为对象
                    streamMemory = new MemoryStream(binaryData);
                    data = formatter.Deserialize(streamMemory);
                }
                catch
                {
                    // 不能得到数据,设为空
                    data = null;
                }
                finally
                {
                    //最后关闭文件
                    sr.Close();
                }

            }
            catch
            {
                // 不能得到数据,设为空
                data = null;
            }
            //返回数据
            return data;
        }
            

    }
}

你可能感兴趣的:(.net)