none
怎么实现ISerializable? RRS feed

  • 问题

  • 我有一个基类,希望它以及其子类是可序列化的。注意到[Serializable]是不继承的,所以该基类的子类也必须标识[Serializable]特性,不方便。

     

    于是考虑用ISerializable接口,然后需要实现GetObjectData方法。MSDN上演示的看起来是高级的用法,我只是想要简单的那种序列化,且子类的新增字段能得到保存,所以在GetObjectData里应该怎么写?


    2011年11月18日 13:29

答案

  • 最简单的办法:把父类和子类都标记上Serializable即可实现类的序列化。只要加一个Serializable,没有很大的不方便。而且即便你实现了ISerializable接口,你还是要加一个Serializable标记的。

     


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    • 已标记为答案 Paul Zhou 2011年11月28日 7:49
    2011年11月19日 3:48
    版主
  • 你实在要这样做,也可以:

    namespace A
    {
        [Serializable]
        class F
        {
            public string Id { getset; }
        }
        [Serializable]
        class S : FISerializable
        {
            public string Name { getset; }
     
            public void GetObjectData(SerializationInfo info, StreamingContext context)
            {
                foreach (PropertyInfo item in this.GetType().GetProperties(BindingFlags.Instance|BindingFlags.Public|BindingFlags.GetProperty))
                {
                    info.AddValue(item.Name,item.GetValue(this,null));
                }
            }
            public S()
            {
     
            }
            private S(SerializationInfo s, StreamingContext c)
            {
                foreach (PropertyInfo item in this.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty))
                {
                    item.SetValue(this,s.GetString(item.Name), null);
                }
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                S s = new S { Id = "1", Name = "Student1" };
                BinaryFormatter bf = new BinaryFormatter();
     
                //序列化
                MemoryStream ms = new MemoryStream();
                bf.Serialize(ms, s);
     
                //反序列化
                ms.Position = 0;
                s = (S)bf.Deserialize(ms);
                Console.WriteLine(s.Id);
                Console.WriteLine(s.Name);
     
            }
        }
    }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    • 已标记为答案 Paul Zhou 2011年11月28日 7:49
    2011年11月19日 4:07
    版主

全部回复

  • 最简单的办法:把父类和子类都标记上Serializable即可实现类的序列化。只要加一个Serializable,没有很大的不方便。而且即便你实现了ISerializable接口,你还是要加一个Serializable标记的。

     


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    • 已标记为答案 Paul Zhou 2011年11月28日 7:49
    2011年11月19日 3:48
    版主
  • 你实在要这样做,也可以:

    namespace A
    {
        [Serializable]
        class F
        {
            public string Id { getset; }
        }
        [Serializable]
        class S : FISerializable
        {
            public string Name { getset; }
     
            public void GetObjectData(SerializationInfo info, StreamingContext context)
            {
                foreach (PropertyInfo item in this.GetType().GetProperties(BindingFlags.Instance|BindingFlags.Public|BindingFlags.GetProperty))
                {
                    info.AddValue(item.Name,item.GetValue(this,null));
                }
            }
            public S()
            {
     
            }
            private S(SerializationInfo s, StreamingContext c)
            {
                foreach (PropertyInfo item in this.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty))
                {
                    item.SetValue(this,s.GetString(item.Name), null);
                }
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                S s = new S { Id = "1", Name = "Student1" };
                BinaryFormatter bf = new BinaryFormatter();
     
                //序列化
                MemoryStream ms = new MemoryStream();
                bf.Serialize(ms, s);
     
                //反序列化
                ms.Position = 0;
                s = (S)bf.Deserialize(ms);
                Console.WriteLine(s.Id);
                Console.WriteLine(s.Name);
     
            }
        }
    }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    • 已标记为答案 Paul Zhou 2011年11月28日 7:49
    2011年11月19日 4:07
    版主
  • 学习了。
    2012年2月10日 2:48