正在阅读:基础编程:.Net里的序列化基础编程:.Net里的序列化

2004-05-19 10:11 出处:CSDN 作者:possible_Y 责任编辑:huangpeidan

  在实现 GetObjectData 方法时,最常调用的SerializationInfo的方法是AddValue,这个方法具有针对所有标准类型(int、char等等)的重载版本;而 StreamingContext 参数描述给定的序列化流的源和目标,这样我们就可以知道我们是将对象序列化到持久性存储还是在将他们跨进程或机器序列化。而在反序列化时,我们调用SerializationInfo提供的一组Getxxx方法,他们针对所有标准类型数据执行各种AddValue重载版本的逆操作。下代码示例说明了如何在前一部分中提到的 MyObject 类上实现 ISerializable。

  [Serializable]
  public class MyObject : ISerializable
  {
    public int n1;
    public int n2;
    public String str;
  
    public MyObject()
    {
    }
  
    protected MyObject(SerializationInfo info, StreamingContext context)
    {
      n1 = info.GetInt32("i");
        n2 = info.GetInt32("j");
    str = info.GetString("k");
      }
  
  public virtual void GetObjectData(SerializationInfo info,
    StreamingContext context)
    {
      info.AddValue("i", n1);
      info.AddValue("j", n2);
      info.AddValue("k", str);
    }
  }
  在序列化过程中调用 GetObjectData 时,需要填充方法调用中提供的 SerializationInfo 对象。只需按名称/值对的形式添加将要序列化的变量。其名称可以是任何文本。只要已序列化的数据足以在反序列化过程中还原对象,便可以自由选择添加至 SerializationInfo 的成员变量。如果基对象实现了 ISerializable,则派生类应调用其基对象的 GetObjectData 方法。
  
  需要强调的是,将 ISerializable 添加至某个类时,需要同时实现 GetObjectData 以及特殊的具有特定原型的构造函数--重要的是,该构造函数的参数列表必须与GetObjectData相同,这个构造函数将会在反序列化的过程中使用:格式化器从流中反序列化数据,然后通过这个构造函数对对象进行实列化。如果缺少 GetObjectData,编译器将发出警告。

  但是,由于无法强制实现构造函数,所以,缺少构造函数时不会发出警告。如果在没有构造函数的情况下尝试反序列化某个类,将会出现异常。在消除潜在安全性和版本控制问题等方面,当前设计优于 SetObjectData 方法。例如,如果将 SetObjectData 方法定义为某个接口的一部分,则此方法必须是公共方法,这使得用户不得不编写代码来防止多次调用 SetObjectData 方法。可以想象,如果某个对象正在执行某些操作,而某个恶意应用程序却调用此对象的 SetObjectData 方法,将会引起一些潜在的麻烦。

  希望看到更多更经典的开发技巧,请随时刷新《开发特区》栏目。
察看评论详细内容 我要发表评论
作者笔名 简短内容 发表时间
:

键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品