要实现上述类的实例的序列化,可参照如下例子:
meablock myblock = new meablock();
// insert code to set properties and fields of the object.
xmlserializer myserializer = new xmlserializer(typeof(meablock));
// to write to a file, create a streamwriter object.
streamwriter mywriter = new streamwriter("myfilename.xml");
myserializer.serialize(mywriter, meablock);
需要注意的是xml序列化只会将public的字段保存,对于私有字段不予于保存。
生成的xml文件格式如下:
<meablock>
<caption>test</caption>
</meablock>
对于对象的反序列化,则如下:
meablock myblock;
// constructs an instance of the xmlserializer with the type
// of object that is being deserialized.
xmlserializer myserializer = new xmlserializer(typeof(meablock));
// to read the file, creates a filestream.
filestream myfilestream = new filestream("myfilename.xml", filemode.open);
// calls the deserialize method and casts to the object type.
myblock = (meablock)myserializer.deserialize(myfilestream)
2、二进制序列化
与xml序列化不同的是,二进制序列化可以将类的实例中所有字段(包括私有和公有)都进行序列化操作。这就更方便、更准确的还原了对象的副本。
要实现上述类的实例的序列化,可参照如下例子:
meablock myblock = new meablock();
// insert code to set properties and fields of the object.
iformatter formatter = new binaryformatter();
stream stream = new filestream("myfile.bin",filemode.create,fileaccess.write, fileshare.none);
formatter.serialize(stream, myblock);
stream.close();
对于对象的反序列化,则如下:
iformatter formatter = new binaryformatter();
stream stream = new filestream("myfile.bin", filemode.open,fileaccess.read, fileshare.read);
meablock myblock = (meablock) formatter.deserialize(stream);
stream.close();
三、如何变相实现自定义可视化控件的序列化、反序列化
对于winform中自定义控件,由于继承于system.windows.form类,而form类又是从marshalbyrefobject继承的,窗体本身无法做到序列化,窗体的实现基于win32下gui资源,不能脱离当前上下文存在。
当然可以采用变通的方法实现控件的序列化。这里采用的是记忆类模型。
定义记忆类(其实就是一个可序列化的实体类)用于记录控件的有效属性,需要序列化控件的时候,只需要将该控件的实例copy到记忆类,演变成序列化保存该记忆类的操作。
反序列化是一个逆过程。将数据流反序列化成为该记忆类,再根据该记忆类的属性生成控件实例。而对于控件的一些事件、方法则可以继续使用。
新闻热点
疑难解答
图片精选