给你一些参考吧! :)
基本序列化
令一个类可序列化的最简单的方式是按如下所示使用 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;
}
使用序列化属性十分方便,但它可能具有上面阐释的局限性。有关何时您应为序列化标记类,请参考在序列化指导方针中提供的指导方针,因为在类已被编译后您不能将序列化添加到该类上。

解决方案 »

  1.   

    还可以通过实现Iserializable结构来自定义序列化的方法,
    这种方法对序列化是需要进行计算等处理的情况非常有效。
      

  2.   

    如果只是public成员和properties, 也可以使用XmlSerializer保存为自定义的XML格式。
      

  3.   

    序列化好办,主要的问题是如何将序列化后的数据直接存入数据库表的一个字段,当然应是BLOB字段,如SQL Server的varbinary或image,或Access的OLE字段。我知道序列化后的数据可以指定为Stream(FileStream/BufferedStream/MemoryStream),并将Stream存入一个独立的二进制文件,大多数的帮助和示例也都是介绍的这种方式。但我希望将能将Stream直接存入数据表的一个二进制字段,不经过中间文件的转换。所以,我的问题主要还是一个数据库的操作问题,而不是一个简单的序列化过程问题。我的设想是基于如下的考虑:我要开发的应用中,表的行数和列数对于不同的应用实例是变化的,且列的属性和数据类型也不是确定的,因此很难将应用实例中的某一数据列与数据库表中的某一具体字段对应,因此最好能实现将实例中一个具体的表(所有列及所有行)与数据库表中的一个记录的一个BLOB字段对应,而不是数据库表的多个字段多个纪录。我考虑了两种方式,一种是利用对象序列化,将具体表对象序列化为一个二进制数据流后存入一个BLOB字段;另一种方式是将一个具体表对象的各个属性归结为一个DataTable,然后将包含此DataTable的DataSet转为XML,然后存入一个BLOB字段。我的设想是否可行和合理?大家有何高见?多谢!
      

  4.   

    不用中间文件的话可以使用MemoryStream取代FileStream,然后读出byte[]信息。