• 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查询,这样就可以很方便的查询图片了。

  • 相关阅读:
    实现快速读写配置文件的内容,可以用于读取*.exe.config文件或者Web.Config文件的内容,或者可以读取指定文件的配置项.
    DevExpress Grid控件经典常用功能代码收集
    DevExpress XtraGrid数据绑定:添加非绑定列
    DevExpress XtraGrid网格控件示例六:自定义合并单元格
    DevExpress XtraGrid网格控件示例七:列过滤
    DevExpress XtraGrid网格控件示例三:获取当前处于编辑状态的值
    DevExpress XtraGrid网格控件示例四:初始化新建行的单元格
    DevExpress XtraGrid网格控件示例五:验证终端用户输入的数据
    ASP.NET MVC 音乐商店
    ASP.NET MVC 音乐商店
  • 原文地址:https://www.cnblogs.com/dream844/p/3317162.html
Copyright © 2020-2023  润新知