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