• 多态的实现序列化


    转载:http://www.cnblogs.com/jiangfei5945/p/3483704.html


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

    举例来说,下面的代码,定义了三个类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)。


  • 相关阅读:
    Kafka(Go)系列(一)通过dockercompose 安装 Kafka
    grpc通过自签CA证书、server、client双向认证【支持go1.15】
    Go 基准测试和性能测试学习使用
    Debian关闭防火墙
    服务依赖开闭简单算法
    Hbase 和 Hive 的区别,各自使用场景。
    VMware虚拟机 Ubuntu1404
    安装protoc
    Redis大 key 自动过期的问题
    MySQL设置数据库为只读
  • 原文地址:https://www.cnblogs.com/hanjun0612/p/9779868.html
Copyright © 2020-2023  润新知