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

  

扫描二维码关注公众号,回复: 2588690 查看本文章

猜你喜欢

转载自www.cnblogs.com/iWaitYou/p/9433985.html