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

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

  1、不需要Serializable属性,Serializable和NonSerializable属性将会被忽略,但是使用XmlIgnore属性,和NonSerializable属性类似。
  2、该类不能安全地访问私有变成员,所以学要将私有成员改为公共成员,或者提供合适的公共特性。
  3、要求被序列化的类要有一个默认的构造器。
  
  我们改一下前面的MyObject类为:
  
  public class MyObject {
    public int n1;
    public String str;
    public MyObject(){}
    public MyObject(n1,str)
    {
   this.n1=n1;
   this.str=str;
    }
    public override string ToString()
    {
   return String.Format("{0}:{1}",this.str,this.n1);
    }
  }
  
  现在我们用XmlSerializer类来对修改后的MyObject进行序列化。因为XmlSerializer类的构造器里有个Type参数,所以XmlSerializer对象被明确的 连到该Type参数所表示的类了。XmlSerializer类也有Serialize和Deserialize方法:
  MyObject obj = new MyObject(12,"some string...");
  XmlSerializer formatter = new XmlSerializer(typeof(MyObject));
  Stream stream = new FileStream("MyFile.xml", FileMode.Create,
  FileAccess.Write, FileShare.None);
  formatter.Serialize(stream, obj);
  //下面是反序列化
    stream.Seek(0,SeekOrigin.Begin)
  MyObject obj_out=(MyObject)formatter.Deserialize(stream)
  stream.Close();
  Console.WriteLine(obj_out);
    
  这个简单的列子可以加以扩展,以便利用更多的XmlSerializer功能,包括使用属性控制xml标记、使用xml模式和进行soap编码。
  
  自定义序列化

  如果你希望让用户对类实现序列化,但是对数据流的组织方式不完全满意,那么可以通过在对象上实现 ISerializable 接口来自定义序列化过程。这一功能在反序列化后成员变量的值失效时尤其有用,但是需要为变量提供值以重建对象的完整状态。除了必须将类申明为 Serializable 的同时,还要要实现 ISerializable接口,需要实现 GetObjectData 方法以及一个特殊的构造函数,在反序列化对象时要用到此构造函数。

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

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

关注我们

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