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 方法以及一个特殊的构造函数,在反序列化对象时要用到此构造函数。
希望看到更多更经典的开发技巧,请随时刷新《开发特区》栏目。
|