C# 泛型及繼承層次對象的序列化及反序列化

目標:要序列化如下的泛型對象爲byte[],並可以反序列化

List<ISyntaxErro> synerroList;

主要類定義如下:
    public interface ISyntaxErro
    {
        ISwitch_DEV VerifySwitch { get;set;}
        string Expressionstr { get;set;}
        SYNTAXERROTYPE SyntaxErroType { get;set;}
        string GetErroInfo();
    }

    [Serializable]
    internal class SyntaxErro : ISyntaxErro
    {
        ISwitch_DEV m_VerifySwitch;
        string m_Expressionstr;


        public SyntaxErro(ISwitch_DEV _VerifySwitch, string _Expressionstr)
        {
            m_VerifySwitch = _VerifySwitch;
            m_Expressionstr = _Expressionstr;
        }
        public ISwitch_DEV VerifySwitch { get { return m_VerifySwitch; } set { m_VerifySwitch = value; } }
        public string Expressionstr { get { return m_Expressionstr; } set { m_Expressionstr = value; } }
        public string GetErroInfo()
        {
        }
    }

    public interface ISubstation_DEV
    {
        int ID { get;}
        string Name { get;}
    }
    public interface ISwitch_DEV
    {
        int ID { get;}
        string Name { get;}
        string ShortName { get;}
        ISubstation_DEV Station { get;}
        IConditionGroup HConditionGroups { get;set;}
        IConditionGroup LConditionGroups { get;set;}
        IConditionGroup HConditionGroups_our { get;set;}
        IConditionGroup LConditionGroups_our { get;set;}
    }

    [Serializable]
    internal class Substation_DEV : ISubstation_DEV
    {
        int m_id;
        string m_name;
        public Substation_DEV(int id, string name)
        {
            m_id = id;
            m_name = name;
        }
        public int ID { get { return m_id; } }
        public string Name { get { return m_name; } }
    }
    [Serializable]
    internal abstract class Switch_DEV : ISwitch_DEV
    {
        int m_id;
        string m_name;
        string m_shortName;
        ISubstation_DEV m_station;
        [NonSerialized]
        IConditionGroup m_HConditionGroups;
        [NonSerialized]
        IConditionGroup m_LConditionGroups;
        [NonSerialized]
        IConditionGroup m_HConditionGroups_our;
        [NonSerialized]
        IConditionGroup m_LConditionGroups_our;
        public Switch_DEV(int id, string name, string shortName, ISubstation_DEV station)
        {
            m_id = id;
            m_name = name;
            m_shortName = shortName;
            m_station = station;
        }
        public int ID { get { return m_id; } }
        public string Name { get { return m_name; } }
        public string ShortName { get { return m_shortName; } }
        public ISubstation_DEV Station { get { return m_station; } }


        public IConditionGroup HConditionGroups { get { return m_HConditionGroups; } set { m_HConditionGroups = value; } }
        public IConditionGroup LConditionGroups { get { return m_LConditionGroups; } set { m_LConditionGroups = value; } }
        public IConditionGroup HConditionGroups_our { get { return m_HConditionGroups_our; } set { m_HConditionGroups_our = value; } }
        public IConditionGroup LConditionGroups_our { get { return m_LConditionGroups_our; } set { m_LConditionGroups_our = value; } }

    }


序列化及反序列化方法(從其他地方借鑑並進行了簡單修改):

        public static byte[] SerializeToBuffer<T>(T obj)
        {
            try
            {
                IFormatter formatter = new BinaryFormatter();
                MemoryStream stream = new MemoryStream();
                formatter.Serialize(stream, obj);
                stream.Position = 0;
                byte[] buffer = new byte[stream.Length];
                stream.Read(buffer, 0, buffer.Length);
                stream.Flush();
                stream.Close();
                return buffer;
            }
            catch (Exception ex)
            {
                throw new Exception("序列化失敗,原因:" + ex.Message);
            }
        }

        public static T DesrializeFromBuffer<T>(T obj, byte[] buffer)
        {
            try
            {
                obj = default(T);
                IFormatter formatter = new BinaryFormatter();
                MemoryStream stream = new MemoryStream(buffer);
                obj = (T)formatter.Deserialize(stream);
                stream.Flush();
                stream.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("反序列化失敗,原因:" + ex.Message);
            }
            return obj;
        }

經過使用,以上方法可行,特此記錄


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章