zoukankan      html  css  js  c++  java
  • C# Serialize

    一.序列化又称为串行化,是.NET运行时环境用来支持用户自定义类型的机制,目的是以某种存储给对象持久化,或者是将这种对象传输到另一个地方,

    二. .NET框架提供了两种序列化的方式 一种是使用BinaryFormatter,另一种是SoapFormatter进行序列化,不过还有一种繁琐的序列化方式(XmlSerializer);

    三.可以使用[Serializable]属性将类标记为可序列化,如果不想让某个类序列化,可以使用[NonSerialized] 或者 [XmlIgnore] 两种方式.

    四.下面是一个可序列化的类

    using System.IO;
    using System.Runtime.Serialization.Formatters.Binary;//引入命名空间
    /// <summary>
    /// ClassToSerialize 的摘要说明
    /// </summary>
    [Serializable] //可序列化标志
    public class ClassToSerialize
    {
    public int id = 100;
    public string name = "Name";
    [NonSerialized] //不可序列化标志
    public string Sex = "男";
    }
    五.序列化和反序列化的方法

    public void SerializeNow()
    {
    Class1ToSerialize Class1To = new Class1ToSerialize();
    FileStream fileStream = new FileStream("D:\temp.txt", FileMode.Create);
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    binaryFormatter.Serialize(fileStream,Class1To); //序列化 参数:流 对象
    fileStream.Close();
    }
    public void DeSerializeNow()
    {
    Class1ToSerialize c = new Class1ToSerialize();
    c.sex = "kkkk";
    FileStream fileStream = new FileStream("D:\temp.txt", FileMode.Open);
    BinaryFormatter b = new BinaryFormatter();
    c = b.Deserialize(fileStream) as Class1ToSerialize; //反序列化 替换对象
    Console.Write(c.sex);
    Console.Write(c.name);
    fileStream.Close();
    }
    六.使用SoapFormatter进行串行化()
    这个和BinaryFormatter基本一样
    我们只需要做一个简单的修改
    1.项目引用using System.Runtime.Serialization.Formatters.Soap;
    2.引用using System.Runtime.Serialization.Formatters.Soap;命名空间
    3.将formatters.binary改成formatters.Soap;
    4.将所有的binaryFormatter改成soapformatter
    5.将流改为XML格式的文件
    研究:不过微软已经对SoapFormatter放弃了 因为不支持泛型的序列化

     关于SoapFormatter的序列化结果 有诸多的Soap特性,为了除掉Soap特性,我们要使用XmlSerializer 库类

    七.使用XmlSerialize进行序列化(支持泛型的Xml序列化)
    XmlSerializer进行序列化 我们需要做一下修改
    a.添加System.Xml.Serialization;命名空间
    b.Serializable和NoSerialized属性将会被忽略,而是使用了[XmlIgnore] 它和NoSerialized类似
    c.XmlSerializer要求被序列化的类要有默认的构造器 这个条件可能默认满足!

    [Serializable]
        public class Person
        {
            private string name;
    ​
            public string Name
            {
                get
                {
                    return name;
                }
                set
                {
                    name = value;
                }
            }
            public string Sex;
            public Hobby[] hobby = new Hobby[2];
            [XmlIgnore]
            public int age = 23;
            /// <summary>
            /// 构造函数
            /// </summary>
            public Person()
            {
    ​
            }
            /// <summary>
            /// 带参数的构造函数
            /// </summary>
            /// <param name="Name">姓名</param>
            public Person(string Name)
            {
                name = Name;
                Sex = "男";
            }
        }
    //序列化方法
     public class XmlSerializeVoid
        {
            /// <summary>
            ///     XmlSerialize序列化方法
            /// </summary>
            /// <param name="person">系列化对象</param>
            public void XmlSerialize(Person person)
            {
                XmlSerializer xml = new XmlSerializer(typeof(Person));
                FileStream stream = new FileStream("D:\myxml.xml", FileMode.Create);
                xml.Serialize(stream,person);      //序列化
                stream.Close();
            }
            /// <summary>
            /// 反序列化方法
            /// </summary>
            /// <param name="person">序列化对象</param>
            public Person XmlDeserialize()
            {
                XmlSerializer xml = new XmlSerializer(typeof(Person));
                FileStream stream = new FileStream("D:\myxml.xml", FileMode.Open);
                Person person =  xml.Deserialize(stream) as Person;
                stream.Close();
                return person;
            }
        }
    Main方法
    static void Main(string[] args)
            {
                Person person = new Person("张子浩");
                person.hobby[0] = new Hobby() { hobbyName = "打代码"};
                person.hobby[1] = new Hobby() { hobbyName = "听歌曲" };
                XmlSerializeVoid xmlSerialize = new XmlSerializeVoid();
                xmlSerialize.XmlSerialize(person) ;
                Console.WriteLine("序列化成功:");
                Person newperson = xmlSerialize.XmlDeserialize();
                Console.WriteLine("反序列化成功:");
                Console.WriteLine("年龄"+newperson.age);
                Console.WriteLine("姓名"+newperson.Name);
                Console.WriteLine("性别"+newperson.Sex);
                Console.WriteLine("爱好1"+newperson.hobby[0].hobbyName);
                Console.WriteLine("爱好2" + newperson.hobby[1].hobbyName);
            }
    

      

  • 相关阅读:
    以您熟悉的编程语言为例完成一个hello/hi的简单的网络聊天程序——网络程序设计课第二次作业
    逆波兰表达式改写(C++)
    侯捷老师的C++代码:基于对象的类别之二带指针的成员函数 Mystring实现
    侯捷老师的C++代码: 基于对象之一 无指针类型 复数类实现
    雇员记录系统(C++)
    设计模式-Interpreter(行为模式) 使用解释器给用户提供一个一门定义语言的语法表示的解释器,通过该解释器解释语言中的句子。
    设计模式-Iterator(行为模式) 将聚合的遍历封装到一个类中
    设计模式-Chain of Responsibility (行为模式) 降低系统的耦合性
    设计模式-Visitor(行为模式) 一个类在不修改自己的同时增加了新的操作,存在问题是 1:破坏了封装性 2:扩展困难
    设计模式-Command(行为模式) 将一个请求封装到一个Command类中,提供一个处理对象Receiver,将Command由Invoker激活。
  • 原文地址:https://www.cnblogs.com/ZaraNet/p/9433985.html
Copyright © 2011-2022 走看看