net中对象序列化方法论文

net中对象序列化方法论文

ID:25252963

大小:51.00 KB

页数:5页

时间:2018-11-19

net中对象序列化方法论文_第1页
net中对象序列化方法论文_第2页
net中对象序列化方法论文_第3页
net中对象序列化方法论文_第4页
net中对象序列化方法论文_第5页
资源描述:

《net中对象序列化方法论文》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、NET中对象序列化方法论文clr/assem/ToFile"SOAP-ENV:Bodya1:MyObjectid="ref-1"n11/n1n224/n2strid="ref-3"一些字符串/str/a1:MyObject/SOAP-ENV:Body/SOAP-ENV:Envelope需要注意的是,无法继承Serializable属性。如果从MyObject派生出一个新的类,则这个新的类也必须使用该属性进行标记,否则将无法序列化。例如,如果试图序列化以下类实例,将会显示一个SerializationException,说明

2、MyStuff类型未标记为可序列化。publicclassMyStuff:MyObject{publicintn3;}5选择性序列化类通常包含不应被序列化的字段。例如,假设某个类用一个成员变量来存储线程ID。当此类被反序列化时,序列化此类时所存储的ID对应的线程可能不再运行,所以对这个值进行序列化没有意义。可以通过使用NonSerialized属性标记成员变量来防止它们被序列化,如下所示:SerializablepublicclassMyObject{publicintn1;NonSerializedpublicintn2

3、;publicStringstr;}6自定义序列化可以通过在对象上实现ISerializable接口来自定义序列化过程。这一功能在反序列化后成员变量的值失效时尤其有用,但是需要为变量提供值以重建对象的完整状态。要实现ISerializable,需要实现GetObjectData方法以及一个特殊的构造函数,在反序列化对象时要用到此构造函数。以下代码示例说明了如何在前一部分中提到的MyObject类上实现ISerializable接口。SerializablepublicclassMyObject:ISerializable{

4、publicintn1;publicintn2;publicStringstr;publicMyObject(){}protectedMyObject(SerializationInfoinfo,StreamingContextcontext){n1=info.GetInt32("i");n2=info.GetInt32("j");str=info.GetString("k");}publicvirtualvoidGetObjectData(SerializationInfoinfo,StreamingContextcon

5、text){info.AddValue("i",n1);info.AddValue("j",n2);info.AddValue("k",str);}}在序列化过程中调用GetObjectData时,需要填充方法调用中提供的SerializationInfo对象。只需按名称/值对的形式添加将要序列化的变量。其名称可以是任何文本。只要已序列化的数据足以在反序列化过程中还原对象,便可以自由选择添加至SerializationInfo的成员变量。如果基对象实现了ISerializable,则派生类应调用其基对象的GetObject

6、Data方法。需要强调的是,将ISerializable添加至某个类时,需要同时实现GetObjectData以及特殊的构造函数。如果缺少GetObjectData,编译器将发出警告。但是,由于无法强制实现构造函数,所以,缺少构造函数时不会发出警告。如果在没有构造函数的情况下尝试反序列化某个类,将会出现异常。在反序列化过程中,使用出于此目的而提供的构造函数将SerializationInfo传递给类。对象反序列化时,对构造函数的任何可见性约束都将被忽略,因此,可以将类标记为public、protected、internal

7、或private。通常,在类未封装的情况下,将构造函数标记为protect。如果类已封装,则应标记为private。要还原对象的状态,只需使用序列化时采用的名称,从SerializationInfo中检索变量的值。如果基类实现了ISerializable,则应调用基类的构造函数,以使基础对象还原其变量。如果从实现了ISerializable的类派生出一个新的类,则只要新的类中含有任何需要序列化的变量,就必须同时实现构造函数以及GetObjectData方法。以下代码片段显示了如何使用上文所示的MyObject类来完成此操作

8、。SerializablepublicclassObjectT;publicObjectTingContextcontext):base(si,context){num=si.GetInt32("num");}publicoverridevoidGetObjectData(SerializationIn

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。