序列化:就是把一个对象转换为可以保存的形式,以便于保持或者传输。
有两种方式:
1.二进制序列化:可以保持一个对象所有的数据,对于在应用程序的不同调用之间保留对象的状态很有用。
2.XML序列化:仅序列化公共属性和字段,而且不保留类型信息。但是XML是开放的标准,所有要在不同的系统之间
共享数据,是个很好的选择。
一. 实现二进制最简单的方法就是把类标记为Serializable。
usingSystem;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace_06_04
{
[Serializable]
public class MyClass
{
public string Name;
private int age;
private double height;
public MyClass(int Age, double Height)
{
this.age =Age;
this.height= Height;
}
public int Age
{
get
{
return age;
}
}
public double Height
{
get
{
return height;
}
}
}
public class class_06_04
{
public static void Main()
{
MyClass me =new MyClass(24, 1.76);
me.Name ="Fei";
BinaryFormatter formatter = new BinaryFormatter();
Streamstream = new FileStream("MyFile.txt", FileMode.Create,FileAccess.Write,
FileShare.None);
formatter.Serialize(stream, me);
stream.Close();
stream = new FileStream("MyFile.txt",FileMode.Open);
MyClassmetoo = (MyClass)formatter.Deserialize(stream);
stream.Close();
Console.WriteLine("我是{0}", metoo.Name);
Console.WriteLine("我的年龄是{0}", metoo.Age);
Console.WriteLine("我的身高是{0}",metoo.Height);
Console.ReadLine();
}
}
}
二:使用XmlSerializer进行序列化
usingSystem;
using System.IO;
using System.Runtime.Serialization;
//using System.Runtime.Serialization.Formatters.Binary;
using System.Xml.Serialization;
namespace_06_04
{
[Serializable]
public class MyClass
{
public string Name;
private int age;
private double height;
public MyClass()
{ }
public MyClass(int Age, double Height)
{
this.age =Age;
this.height= Height;
}
public int Age
{
get
{
return age;
}
}
public double Height
{
get
{
return height;
}
}
}
public class Class_06_04
{
public static void Main()
{
MyClass me =new MyClass(24, 1.76);
me.Name ="Fei";
XmlSerializer srl = new XmlSerializer(typeof(MyClass));
StreamWriterwrt = new StreamWriter("MyFile.xml");
srl.Serialize(wrt, me);
wrt.Close();
StreamReader rdr = new StreamReader("MyFile.xml");
MyClassnotme = (MyClass)srl.Deserialize(rdr);
rdr.Close();
Console.WriteLine("我是{0}", notme.Name);
Console.WriteLine("我的年龄是{0}", notme.Age);
Console.WriteLine("我的身高是{0}", notme.Height);
Console.ReadLine();
}
}
}
输出结果
我是 Fei
我的年龄 0
我的身高 0
这其中只有public字段Name被成功的序列化和反序列化,其余两个字段都没有成功。
三. 我们可以使用Attribute来对序列化进行一些控制,可以控制一个字段是否被序列化,不过无法让
XmlSerializer序列化非public字段。
usingSystem;
using System.IO;
using System.Runtime.Serialization;
//using System.Runtime.Serialization.Formatters.Binary;
using System.Xml.Serialization;
namespace _06_04
{
[Serializable]
public class MyClass
{
public string Name;
[XmlElement(ElementName = "MyAge")]
public int Age;
}
public class Class_06_04
{
public static void Main()
{
MyClass me =new MyClass();
me.Name ="Fei";
me.Age = 19;
XmlSerializer srl = new XmlSerializer(typeof(MyClass));
StreamWriterswr = new StreamWriter("MyFile1.xml");
srl.Serialize(swr, me);
swr.Close();
}
}
}
打开xml可以看到
<?xml version="1.0" encoding="utf-8" ?>
- <MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Name>Fei</Name>
<MyAge>19</MyAge>
</MyClass>
其中Age字段的名字在xml中变成了MyAge了。