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);
            }
    

      

  • 相关阅读:
    Eureka 集群搭建
    Eureka 基本使用操作
    服务治理 Eureka基础认识
    docker-compose命令不存在(docker-compose not found)
    用来存放下一条将要执行的指令地址的寄存器是
    从左线性文法构造有限自动机时,通常自动机状态个数比文法非终结符号数多
    现代多数实用编译程序所产生的目标代码都是一种可重定位的指令代码,在运行前必须借助于一个
    js正则表达式验证端口范围(0-65535)
    IDEA新建Spring配置文件的方法
    webpack-dev-server config.js Cannot find module
  • 原文地址:https://www.cnblogs.com/ZaraNet/p/9433985.html
Copyright © 2011-2022 走看看