.NET-23-Xml自定义序列化|自定义特性并根据特性过滤属性

自定义序列化Xml文件

自定义特性并且根据自定义的特性在序列化Xml文件的时候过滤杯特性标记的属性

public class Xml序列化
    {

        public static void GetXmlXLH()
        {
            #region      XmlSerializer序列化xml文件

            //序列化一个对象
            Person p = new Person() { Name = "刘备", Age = 18, Address = "马里亚纳海沟" };

            //创建初始化器
            XmlSerializer xml = new XmlSerializer(typeof(Person));
            using (FileStream fWrite = new FileStream(@"C:\Users\Administrator\Desktop\test\练习用文件\XML序列化.xml", FileMode.OpenOrCreate, FileAccess.Write))
            {
                xml.Serialize(fWrite, p);
            }

            //序列化一个list数组
            List<Person> list = new List<Person>();
            list.Add(new Person() { Name = "张飞", Age = 44, Address = "冀州" });
            list.Add(new Person() { Name = "赵云", Age = 36, Address = "常山" });
            list.Add(new Person() { Name = "关羽", Age = 46, Address = "解良" });
            list.Add(new Person() { Name = "马超", Age = 37, Address = "茂陵" });
            list.Add(new Person() { Name = "黄忠", Age = 78, Address = "南阳" });

            //创建一个xml初始化器,初始化时传入要序列化的类型
            XmlSerializer xmlSer = new XmlSerializer(typeof(List<Person>));
            //using (FileStream fs = File.OpenWrite(@"C:\Users\Administrator\Desktop\test\练习用文件\xmlXLH.xml"))
            using (FileStream fs = new FileStream(@"C:\Users\Administrator\Desktop\test\练习用文件\xmlXLH.xml", FileMode.OpenOrCreate, FileAccess.Write))
            {
                xmlSer.Serialize(fs, list);
            }
            #endregion      XmlSerializer序列化xml文件

            #region     自定义序列化类

            ////序列化一个list数组
            //List<Person> listZDY = new List<Person>();
            //listZDY.Add(new Person() { Name = "张飞", Age = 44, Address = "冀州" });
            //listZDY.Add(new Person() { Name = "赵云", Age = 36, Address = "常山" });
            //listZDY.Add(new Person() { Name = "关羽", Age = 46, Address = "解良" });
            //listZDY.Add(new Person() { Name = "马超", Age = 37, Address = "茂陵" });
            //listZDY.Add(new Person() { Name = "黄忠", Age = 78, Address = "南阳" });

            ////自定义XML序列化方法,序列化list集合
            //string path = @"C:\Users\Administrator\Desktop\test\练习用文件\xml自定义序列化List.xml";
            //MySerializer(typeof(List<Person>), list, path);


            //序列化一个对象
            Person per = new Person() { Name = "刘备", Age = 18, Address = "马里亚纳海沟" };

            //使用自定义序列化
            string path1 = @"C:\Users\Administrator\Desktop\test\练习用文件\xml自定义序列化.xml";
            MySerializer(typeof(Person), per, path1);


            Car c = new Car() { Brand = "mini", Price = 200000 };
            string path2 = @"C:\Users\Administrator\Desktop\test\练习用文件\xml自定义序列化2.xml";
            MySerializer(typeof(Car), c, path2);
            #endregion     自定义序列化类


        }

        /// <summary>
        /// 自定义的序列化方法
        /// 这里可以提取出来,这里为了看着方便就直接写在这个类中了
        ///
        /// 该自定义方法只有两个功能
        /// 1.实现对象的序列化
        /// 2.实现List集合的序列化
        /// </summary>
        /// <param name="type"></param>
        /// <param name="list"></param>
        private static void MySerializer(Type type, object obj, string path)
        {
            //这里不好判断,所以写死了
            Type islist = typeof(IList<Person>);
            //判断当前类是否实现了IList<T>接口
            if (islist.IsAssignableFrom(type))
            {
                //如果传入的类可以赋值给isList,则说明传过来的是List集合

            }
            else
            {
                //如果不能则按照对象的方式来序列化
                XDocument xDom = new XDocument();
                //获取类的名称作为跟节点
                string typeName = type.ToString();
                string className = typeName.Substring(typeName.LastIndexOf('.') + 1);
                XElement root = new XElement(className);
                //获取所有的属性
                PropertyInfo[] proInfo = type.GetProperties();
                //循环添加属性
                foreach (PropertyInfo item in proInfo)
                {
                    //使用特性判断是否序列化某些属性
                    //判断该属性是否被标记了MyXmlIgnore特性
                    //第一个参数,需要判断的特性,第二个参数,是否判断父类的属性
                    object[] objTX = item.GetCustomAttributes(typeof(MyXmlIgnoreAttribute), false);
                    if (objTX.Count() > 0)
                    {
                        continue;
                    }
                    root.SetElementValue(item.Name, item.GetValue(obj, null));
                }
                //把根节点添加进来
                xDom.Add(root);
                xDom.Save(path);


            }
        }
    }


    /// <summary>
    /// 创建一个类
    /// </summary>
    public class Person
    {
        private string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }


        private int _age;

        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }


        private string _address;

        //这里可以写全名MyXmlIgnoreAttribute
        //也可以简写为MyXmlIgnore把Attribute省略掉
        [MyXmlIgnore]
        public string Address
        {
            get { return _address; }
            set { _address = value; }
        }
    }


    public class Car
    {
        private string _brand;

        public string Brand
        {
            get { return _brand; }
            set { _brand = value; }
        }

        private decimal _price;

        public decimal Price
        {
            get { return _price; }
            set { _price = value; }
        }
    }

    /// <summary>
    /// 创建自己的特性
    /// 用来在序列化Xml的时候忽略某些属性
    /// </summary>
    public class MyXmlIgnoreAttribute : Attribute
    {

    }

猜你喜欢

转载自blog.csdn.net/m0_37532448/article/details/81708548