c# XML序列化与反序列化


序列化对象


    public class People
    {
        [XmlAttribute("NAME")]
        public string Name
        { set; get; }
        [XmlAttribute("AGE")]
        public int Age
        { set; get; }
    }
    [XmlRoot("Root")]
    public class Student : People
    {
        [XmlElement("CLASS")]
        public string Class
        { set; get; }
        [XmlElement("NUMBER")]
        public int Number
        { set; get; }
    }


void Main(string[] args)


{


            Student stu = new Student()
            {
                Age = 10,
                Class = "Class One",
                Name = "Tom",
                Number = 1
            };
            XmlSerializer ser = new XmlSerializer(typeof(Student));
            ser.Serialize(File.Create("C://x.xml"), stu);


}


反序列化对象


            XmlSerializer ser = new XmlSerializer(typeof(Student));
            Student stu = ser.Deserialize(File.OpenRead("C://x.xml")) as Student;


对象数组序列化


    public class People
    {
        [XmlAttribute("NAME")]
        public string Name
        { set; get; }
        [XmlAttribute("AGE")]
        public int Age
        { set; get; }
    }
    [XmlRoot("Root")]
    public class Student : People
    {
        [XmlElement("CLASS")]
        public string Class
        { set; get; }
        [XmlElement("NUMBER")]
        public int Number
        { set; get; }
    }


void Main(string[] args)


{


            List<Student> stuList = new List<Student>();
            stuList.Add(new Student() { Age = 10, Number = 1, Name = "Tom", Class = "Class One" });
            stuList.Add(new Student() { Age = 11, Number = 2, Name = "Jay", Class = "Class Two" });
            stuList.Add(new Student() { Age = 12, Number = 3, Name = "Pet", Class = "Class One" });
            stuList.Add(new Student() { Age = 13, Number = 4, Name = "May", Class = "Class Three" });
            stuList.Add(new Student() { Age = 14, Number = 5, Name = "Soy", Class = "Class Two" });
            XmlSerializer ser = new XmlSerializer(typeof(List<Student>));
            ser.Serialize(File.Create("C://x.xml"), stuList);


}


对象数组反序列


            XmlSerializer ser = new XmlSerializer(typeof(List<Student>));
            List<Student> stuList = ser.Deserialize(File.OpenRead("C://x.xml")) as List<Student>;
            foreach (Student s in stuList)
            {
                MessageBox.Show(string.Format("{0} : {1} : {2} : {3}",
                    s.Name, s.Age, s.Class, s.Number));
            }


序列化Dirctionary


    public struct DirectionList
    {
        [XmlAttribute("Name")]
        public string Name;
        [XmlElement("Value")]
        public int Value;
    }


void Main(string[] args)


{


            Dictionary<string, int> list = new Dictionary<string, int>();
            list.Add("1", 100);
            list.Add("2", 200);
            list.Add("3", 300);
            list.Add("4", 400);
            list.Add("5", 500);
            list.Add("6", 600);
            list.Add("7", 700);
            list.Add("8", 800);
            list.Add("9", 900);


            List<DirectionList> dirList = new List<DirectionList>();
            foreach (var s in list)
            {
                dirList.Add(new DirectionList() { Name = s.Key, Value = s.Value });
            }
            XmlSerializer ser = new XmlSerializer(typeof(List<DirectionList>));
            ser.Serialize(File.Create("C://x.xml"), dirList);


}


这里还要讲一点,在XmlSerializer中,不支持Dirctionary<>类型的对象,所以在序列化这种最常见类型的时候,只能按照它的格式先创建一个可以别序列化的类型,这里我定义了一个结构体,当然你也可以定义成其他的类。将Dictionary<>中的数据依次放进结构体以后就可以放入流中了。


[XmlAttribute("Name")]意思是将这个字段作为xml的属性,属性名跟在“”中


[XmlElement("Value")]意思是将这个字段做为xml的元素。


 


反序列化Dirctionary




            XmlSerializer ser = new XmlSerializer(typeof(List<DirectionList>));
            List<DirectionList> dirList = ser.Deserialize(
                File.OpenRead("C://x.xml")) as List<DirectionList>;
            foreach (var v in dirList)
            {
                Console.WriteLine("{0} : {1}", v.Name, v.Value);
            }


其实我并不喜欢这个名称,感觉有点生化危机的feel,但是也就是这样了,没有太炫的地方,Deserialize反序列化。真希望.Net能集成Dirctionary<>对象,那我们这些懒人就方便了。


在需要序列化的队伍中,数组是很常见的类型,其次就是图片了


序列化图片


    public struct ImageStruct
    {
        [XmlAttribute("Number")]
        public int number;
        [XmlElement("Image")]
        public byte[] picture;
    }


void Main(string[] args)


{


            ImageStruct s = new ImageStruct() { number = 1, picture = File.ReadAllBytes(@"11.jpg") };
            XmlSerializer ser = new XmlSerializer(typeof(ImageStruct));
            FileStream fs = File.Create("c://x.xml");
            ser.Serialize(fs, s);
            fs.Close();


}


一样的,采用结构体来保存图片,这里我还加了个图片的名字,到时候查找起来也方便一些


图片反序列化


            XmlSerializer ser = new XmlSerializer(typeof(ImageStruct));
            ImageStruct s = (ImageStruct)ser.Deserialize(File.OpenRead("c://x.xml"));
            pictureBox1.Image = Image.FromStream(new MemoryStream(s.picture));


没有花头的方式,利用memorystream来做缓存,这样会比较快一点,实际上我并没有怎么感觉。


图片数组序列化


    public struct ImageStruct
    {
        [XmlAttribute("Number")]
        public int number;
        [XmlElement("Image")]
        public byte[] picture;
    }


void Main(string[] args)


{


            List<ImageStruct> imageList = new List<ImageStruct>();
            imageList.Add(new ImageStruct()
            {
                number = 1,
                picture = File.ReadAllBytes(@"11.jpg")
            });
            imageList.Add(new ImageStruct()
            {
                number = 2,
                picture = File.ReadAllBytes(@"22.jpg")
            });


            XmlSerializer ser = new XmlSerializer(typeof(List<ImageStruct>));
            FileStream fs = File.Create("c://x.xml");
            ser.Serialize(fs, imageList);
            fs.Close();


}


图片数组反序列化


            XmlSerializer ser = new XmlSerializer(typeof(List<ImageStruct>));
            List<ImageStruct> s = (List<ImageStruct>)ser.Deserialize(File.OpenRead("c://x.xml"));
            var im = from i in s
                     where i.number == 1
                     select i.picture;


            //var im = s.Where(p => p.number == 1).Select(p => p.picture);
            foreach (var image in im)
            {
                pictureBox1.Image = Image.FromStream(
                    new MemoryStream(image));
            }


这里还对数组结构进行了Linq查询,这样就可以很方便的查询图片了。


 


--------------------------------------------------------------------------------------------------


 


要序列化的对象的类:


 


[Serializable]
public class Person
{
private string name;
public string Name
{
get
{
return name;
}
set
{
name=value;
}
}
public string Sex;
public int Age=31;
public Course[] Courses;


public Person()
{
}
public Person(string Name)
{
name=Name;
Sex="男";

}
[Serializable]
public class Course
{
public string Name;
[XmlIgnore]public string Description;
public Course()
{
}
public Course(string name,string description)
{
Name=name;
Description=description;
}
}  




进行序列化及反序列化的测试类:


class Test
{
//序列化
public void Serialiaze()
{
Person c=new Person("cyj")
c.Courses=new Course[2];
c.Courses[0]=new Course("英语","交流工具")
c.Courses[1]=new Course("数学","自然科学")


XmlSerializer xs=new XmlSerializer(typeof(Person)); 
Stream stream = new FileStream("c://cyj.xml", FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
xs.Serialize(stream, c);
stream.Close();
}
//反序列化
public void Deserialize()
{
XmlSerializer xs=new XmlSerializer(typeof(Person));
Stream stream = new FileStream("c://cyj.xml", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
Person p=(Person)xs.Deserialize(stream);
Console.WriteLine(p.Name);
Console.WriteLine(p.Age.ToString());
Console.WriteLine(p.Courses.Length.ToString());
Console.Read();
}
}
 


格式化后Xml的文档内容为:


<?xml version="1.0"?>
<Person xmlns:xsd=http://www.w3.org/2001/XMLSchema    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <Sex>男</Sex>
   <Age>31</Age>
   <Courses>
     <Course>
       <Name>英语</Name>
     </Course>
     <Course>
       <Name>数学</Name>
     </Course>
   </Courses>
   <Name>cyj</Name>
</Person>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值