C#编程总结(一)序列化总结

2019-12-30 14:47:05王旭

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

几种序列化技术:

1)二进制序列化保持类型保真度,这对于在应用程序的不同调用之间保留对象的状态很有用。例如,通过将对象序列化到剪贴板,可在不同的应用程序之间共享对象。您可以将对象序列化到流、磁盘、内存和网络等等。远程处理使用序列化“通过值”在计算机或应用程序域之间传递对象。

2)XML 序列化仅序列化公共属性和字段,且不保持类型保真度。当您要提供或使用数据而不限制使用该数据的应用程序时,这一点是很有用的。由于 XML 是一个开放式标准,因此,对于通过 Web 共享数据而言,这是一个很好的选择。SOAP 同样是一个开放式标准,这使它也成为一个颇具吸引力的选择。

3)使用提供的数据协定,将类型实例序列化和反序列化为 XML 流或文档(或者JSON格式)。常应用于WCF通信。

BinaryFormatter

序列化可被定义为将对象的状态存储到存储媒介中的过程。在此过程中,对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)都被转换为字节流,然后写入数据流。在以后反序列化该对象时,创建原始对象的精确复本。

1、使一个类可序列化的最简单方式是按如下所示使用 Serializable 属性标记。

2、有选择的序列化

通过用 NonSerialized 属性标记成员变量,可以防止它们被序列化

3、自定义序列化

1) 在序列化期间和之后运行自定义方法

最佳做法也是最简单的方法(在 .Net Framework 2.0 版中引入),就是在序列化期间和之后将下列属性应用于用于更正数据的方法:

OnDeserializedAttribute OnDeserializingAttribute OnSerializedAttribute OnSerializingAttribute

具体事例如下:


// This is the object that will be serialized and deserialized.
[Serializable()]    
public class TestSimpleObject 
{
  // This member is serialized and deserialized with no change.
  public int member1;

  // The value of this field is set and reset during and 
  // after serialization.
  private string member2;

  // This field is not serialized. The OnDeserializedAttribute 
  // is used to set the member value after serialization.
  [NonSerialized()] 
  public string member3; 

  // This field is set to null, but populated after deserialization.
  private string member4;

  // Constructor for the class.
  public TestSimpleObject() 
  {
    member1 = 11;
    member2 = "Hello World!";
    member3 = "This is a nonserialized value";
    member4 = null;
  }

  public void Print() 
  {
    Console.WriteLine("member1 = '{0}'", member1);
    Console.WriteLine("member2 = '{0}'", member2);
    Console.WriteLine("member3 = '{0}'", member3);
    Console.WriteLine("member4 = '{0}'", member4);
  }

  [OnSerializing()]
  internal void OnSerializingMethod(StreamingContext context)
  {
    member2 = "This value went into the data file during serialization.";
  }

  [OnSerialized()]
  internal void OnSerializedMethod(StreamingContext context)
  {
    member2 = "This value was reset after serialization.";
  }

  [OnDeserializing()]
  internal void OnDeserializingMethod(StreamingContext context)
  {
    member3 = "This value was set during deserialization";
  }

  [OnDeserialized()]
  internal void OnDeserializedMethod(StreamingContext context)
  {
    member4 = "This value was set after deserialization.";
  }  
}