给你一些参考吧! :)
基本序列化
令一个类可序列化的最简单的方式是按如下所示使用 Serializable 属性标记它。[Serializable]
public class MyObject {
public int n1 = 0;
public int n2 = 0;
public String str = null;
}
以下代码段说明该类的实例是如何被序列化到一个文件中的。MyObject obj = new MyObject();
obj.n1 = 1;
obj.n2 = 24;
obj.str = "Some String";
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, obj);
stream.Close();
该示例使用二进制格式化程序执行序列化。您需要做的所有工作就是创建流的实例和您想要使用的格式化程序,然后对该格式化程序调用 Serialize 方法。要序列化的流和对象实例被作为参数提供给该调用。尽管在此示例中并没有显式阐释这一点,但一个类的所有成员变量都将被序列化,即使是那些已被标记为私有的变量。在此方面,二进制序列化不同于 XML 序列化程序,后者只序列化公共字段。将对象还原回其以前的状态十分简单。首先,创建用于读取的流和格式化程序,然后指示格式化程序反序列化该对象。下面的代码段说明如何执行上述的操作。IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject) formatter.Deserialize(fromStream);
stream.Close();// Here's the proof
Console.WriteLine("n1: {0}", obj.n1);
Console.WriteLine("n2: {0}", obj.n2);
Console.WriteLine("str: {0}", obj.str);
上面所用的 BinaryFormatter 是非常有效的,并且生成非常简洁的字节流。通过该格式化程序序列化的所有对象都还可以通过该格式化程序被反序列化,这使该工具对于序列化将在 .NET 平台上被反序列化的对象而言十分理想。需要特别注意的是,在反序列化一个对象时不调用构造函数。出于性能方面的原因对反序列化施加了该约束。但是,这违反了运行库生成的与对象编写器有关的一些通常协定,并且开发人员应确保他们在将对象标记为可序列化时理解其后果。如果可移植性是必需的,则代之以使用 SoapFormatter。只需用 SoapFormatter 代替上面代码中的格式化程序,并且如前面一样调用 Serialize 和 Deserialize。此格式化程序为上面使用的示例生成以下输出。<SOAP-ENV:Envelope
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP- ENC=http://schemas.xmlsoap.org/soap/encoding/
xmlns:SOAP- ENV=http://schemas.xmlsoap.org/soap/envelope/
SOAP-ENV:encodingStyle=
"http://schemas.microsoft.com/soap/encoding/clr/1.0
http://schemas.xmlsoap.org/soap/encoding/"
xmlns:a1="http://schemas.microsoft.com/clr/assem/ToFile"> <SOAP-ENV:Body>
<a1:MyObject id="ref-1">
<n1>1</n1>
<n2>24</n2>
<str id="ref-3">Some String</str>
</a1:MyObject>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
需要特别注意的是,Serializable 属性不能被继承。如果我们从 MyObject 派生一个新类,此新类必须也用该属性标记,否则它不能被序列化。例如,当您试图序列化下面的类的实例时,您将获得 SerializationException,它通知您 MyStuff 类型没有被标记为可序列化。public class MyStuff : MyObject
{
public int n3;
}
使用序列化属性十分方便,但它可能具有上面阐释的局限性。有关何时您应为序列化标记类,请参考在序列化指导方针中提供的指导方针,因为在类已被编译后您不能将序列化添加到该类上。
基本序列化
令一个类可序列化的最简单的方式是按如下所示使用 Serializable 属性标记它。[Serializable]
public class MyObject {
public int n1 = 0;
public int n2 = 0;
public String str = null;
}
以下代码段说明该类的实例是如何被序列化到一个文件中的。MyObject obj = new MyObject();
obj.n1 = 1;
obj.n2 = 24;
obj.str = "Some String";
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, obj);
stream.Close();
该示例使用二进制格式化程序执行序列化。您需要做的所有工作就是创建流的实例和您想要使用的格式化程序,然后对该格式化程序调用 Serialize 方法。要序列化的流和对象实例被作为参数提供给该调用。尽管在此示例中并没有显式阐释这一点,但一个类的所有成员变量都将被序列化,即使是那些已被标记为私有的变量。在此方面,二进制序列化不同于 XML 序列化程序,后者只序列化公共字段。将对象还原回其以前的状态十分简单。首先,创建用于读取的流和格式化程序,然后指示格式化程序反序列化该对象。下面的代码段说明如何执行上述的操作。IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject) formatter.Deserialize(fromStream);
stream.Close();// Here's the proof
Console.WriteLine("n1: {0}", obj.n1);
Console.WriteLine("n2: {0}", obj.n2);
Console.WriteLine("str: {0}", obj.str);
上面所用的 BinaryFormatter 是非常有效的,并且生成非常简洁的字节流。通过该格式化程序序列化的所有对象都还可以通过该格式化程序被反序列化,这使该工具对于序列化将在 .NET 平台上被反序列化的对象而言十分理想。需要特别注意的是,在反序列化一个对象时不调用构造函数。出于性能方面的原因对反序列化施加了该约束。但是,这违反了运行库生成的与对象编写器有关的一些通常协定,并且开发人员应确保他们在将对象标记为可序列化时理解其后果。如果可移植性是必需的,则代之以使用 SoapFormatter。只需用 SoapFormatter 代替上面代码中的格式化程序,并且如前面一样调用 Serialize 和 Deserialize。此格式化程序为上面使用的示例生成以下输出。<SOAP-ENV:Envelope
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP- ENC=http://schemas.xmlsoap.org/soap/encoding/
xmlns:SOAP- ENV=http://schemas.xmlsoap.org/soap/envelope/
SOAP-ENV:encodingStyle=
"http://schemas.microsoft.com/soap/encoding/clr/1.0
http://schemas.xmlsoap.org/soap/encoding/"
xmlns:a1="http://schemas.microsoft.com/clr/assem/ToFile"> <SOAP-ENV:Body>
<a1:MyObject id="ref-1">
<n1>1</n1>
<n2>24</n2>
<str id="ref-3">Some String</str>
</a1:MyObject>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
需要特别注意的是,Serializable 属性不能被继承。如果我们从 MyObject 派生一个新类,此新类必须也用该属性标记,否则它不能被序列化。例如,当您试图序列化下面的类的实例时,您将获得 SerializationException,它通知您 MyStuff 类型没有被标记为可序列化。public class MyStuff : MyObject
{
public int n3;
}
使用序列化属性十分方便,但它可能具有上面阐释的局限性。有关何时您应为序列化标记类,请参考在序列化指导方针中提供的指导方针,因为在类已被编译后您不能将序列化添加到该类上。
解决方案 »
- webservice发布后出问题,很着急。100分送上~~
- Javascript 怎么调用CS中查到数据,并且怎么实现循环?
- cookies键数
- 各位C#高手指点,我在父窗体中判断子窗体加载的时间!在线等 往高手指点!
- 告急: 求一个正则表达式, 请入,谢谢!
- 高深高难度:关于DLL函数指针的传递
- 做一个像记事本"查找"的功能对话框有现成的类吗
- 换行符的转换?在线等。。。。
- 用datareader读取数据问题
- [高分]58mm的USB热敏打印机,如何逐行打印?
- 问个关于CSDN实现的问题
- SqlDataReader保存的是sql语句执行的结果,那么它以什么形式保存结果,是查询出的一条记录还是一张表?
这种方法对序列化是需要进行计算等处理的情况非常有效。