zoukankan      html  css  js  c++  java
  • 多态的实现序列化

    多态的实现序列化,乍一听有点蒙,其实就是序列化的时候序列化子类,反序列化的时候能多态的反序列化出子类来。

    举例来说,下面的代码,定义了三个类ClassToSerialize是父类,ConcreteClassToSerializeA 和ConcreteClassToSerializeB 子类。

    当我们序列化是序列化ConcreteClassToSerializeA,反序列化的时候我们希望反序列化出ConcreteClassToSerializeA对象,而不是ConcreteClassToSerializeB ,更不是ClassToSerialize。

        [Serializable]
        [XmlInclude(typeof(ConcreteClassToSerializeA))]
        [XmlInclude(typeof(ConcreteClassToSerializeB))]
        public class ClassToSerialize
        {
            public string Name { get; set; }
            //public bool CanExecute(string name)
            //{
            //    return string.IsNullOrEmpty(name) ? false : true;
            //}
        }
    
        [Serializable]
        public class ConcreteClassToSerializeA : ClassToSerialize
        {
            public int Age { get; set; }
        }
    
        [Serializable]
        public class ConcreteClassToSerializeB : ClassToSerialize
        {
            public string Gender { get; set; }
        }

    要想实现上述的需求,基类上必须添加[XmlInclude(typeof(ConcreteClassToSerializeB))]这样的属性。

            public static void SerializeNow()
            {
                ConcreteClassToSerializeA c = new ConcreteClassToSerializeA();
                c.Name = "asdf";
                c.Age = 12;
                FileStream fileStream = new FileStream("e:\temp1.txt", FileMode.Create);
                XmlSerializer b = new XmlSerializer(typeof(ClassToSerialize));
                b.Serialize(fileStream, c);
                fileStream.Close();
            }
    
            public static void DeSerializeNow()
            {
                object c = null;
                FileStream fileStream = new FileStream("e:\temp1.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
                XmlSerializer b = new XmlSerializer(typeof(ClassToSerialize));
                c = b.Deserialize(fileStream);
                Console.WriteLine(c.ToString());
                fileStream.Close();
            }

    注意XmlSerializer实例化的类型都是typeof(ClassToSerialize)。

  • 相关阅读:
    剑指offer-02-替换空格
    剑指offer-03-从尾到头打印链表
    剑指offer-01-二维数组中的查找
    JS-几类函数
    【工具使用】—VSCode
    【工具使用】—Chrome工具使用技巧
    【codeReview】button-disabled
    c语言中结构体位段
    结构体位断
    malloc/free与 new/delete的区别
  • 原文地址:https://www.cnblogs.com/jiangfei5945/p/3483704.html
Copyright © 2011-2022 走看看