COMPUTER_LZY

要输就输给追求,要嫁就嫁给幸福

导航

c# XML序列化与反序列化

原先一直用BinaryFormatter来序列化挺好,可是最近发现在WinCE下是没有办法进行BinaryFormatter操作,很不爽,只能改成了BinaryWriterBinaryReader来读写,突然想到能不能用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>

 

转自http://blog.csdn.net/ljsql/archive/2009/12/22/5057588.aspx

posted on 2011-10-19 14:45  CANYOUNG  阅读(396)  评论(0编辑  收藏  举报