自定义序列化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
{
}