序列化/反序列化/序列化事件/加解密

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters.Soap;
using System.Data.SqlClient;

namespace Serialize
{
    [Serializable]
    public class Product//:IDeserializationCallback
    {
        
        private string strConn = @"server=.\sqlexpress; database=Northwind;uid=sa;password=123";
        [NonSerialized]//NonSerialized只能加在字段上,不能加在屬性上,SqlConnection對象沒法序列化
        private SqlConnection sqlConn;

        public int id { get; set; }
        public string Name { get; set; }
        public double Price { get; set; }
        public Product(int id) { this.id = id; }

        public Product()
        {
            sqlConn = new SqlConnection(strConn);
        }
        public override string ToString()
        {
            return string.Format("ID:{0},Name:{1},Price:{2},\nConn:{3}",
                id, Name, Price, sqlConn == null ? "Null" : sqlConn.ConnectionString);
        }

        private string XorString(string s)
        {
            char[] chars = s.ToCharArray();
            for (int i = 0; i < chars.Length; i++)
                chars[i] =Convert.ToChar( byte.MaxValue - chars[i]);
            return new string(chars);
        }

        [OnSerializing]//在序列化開始事件中調用此方法,自動
        void OnSerializing(StreamingContext context)
        {
            Console.WriteLine("OnSerializing");
            strConn = XorString(strConn);
        }
        [OnSerialized]//序列化完成後調用此方法
        void OnSerialized(StreamingContext context)
        {
            Console.WriteLine("OnSerialized");
            strConn = XorString(strConn);
        }
        [OnDeserializing]//至關於無參數構造函數,反序列化時初始化對象
        void OnDeserializing(StreamingContext context)
        {
            Console.WriteLine("OnDerializing");
        }
        [OnDeserialized]//反序列化完成後調用此方法
        void OnDeserialized(StreamingContext context)
        {
            Console.WriteLine("OnDerialized");
            strConn = XorString(strConn);
            sqlConn = new SqlConnection(strConn);
        }
        //反序列化不會調用對象的構造函數,反序列化會自動調用此函數完成對象的狀態
        public void OnDeserialization(object sender)
        {
            Console.WriteLine("OnDerializing");
            sqlConn = new SqlConnection(strConn);
        }
    }
    public class MyClass
    {
        public static void SerializeWrite()
        {
            IFormatter formatter = new BinaryFormatter();
            formatter = new SoapFormatter();
            Product product = new Product() {id=188, Name = "iPad Mini4", Price = 3698.5f };
            System.IO.Stream fs = System.IO.File.OpenWrite(@".\product.bin");
            formatter.Serialize(fs, product);
            fs.Dispose();
        }
        public static void SerializeRead()
        {
            IFormatter formatter = new BinaryFormatter();
            formatter = new SoapFormatter();
            System.IO.Stream stream = System.IO.File.OpenRead(@".\product.bin");
            Product product = (Product)formatter.Deserialize(stream);
            stream.Dispose();
            Console.WriteLine(product);
        }
        public static void Main()
        {
            //SerializeWrite();
            SerializeRead();
            Console.ReadKey();
        }
    }
}
相關文章
相關標籤/搜索