国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

有關.NET中序列化的一些知識

2024-07-10 12:58:58
字體:
來源:轉載
供稿:網友
“序列化”可被定義為將對象的狀態存儲到存儲媒介中的過程。在此過程中,對象的公共字段和私有字段以及類的名稱(包括包含該類的程序集)都被轉換為字節流,然后寫入數據流。在以后“反序列化”該對象時,創建原始對象的精確復本。
一、為什么要選擇序列化
    一個原因是將對象的狀態保持在存儲媒體中,以便可以在以后重新創建精確的副本;
    另一個原因是通過值將對象從一個應用程序域發送到另一個應用程序域中。
    例如,序列化可用于在 asp.net 中保存會話狀態并將對象復制到 windows 窗體的剪貼板中。遠程處理還可以使用序列化通過值將對象從一個應用程序域傳遞到另一個應用程序域中。
二、如何實現對象的序列化及反序列化
    要實現對象的序列化,首先要保證該對象可以序列化。而且,序列化只是將對象的屬性進行有效的保存,對于對象的一些方法則無法實現序列化的。
    實現一個類可序列化的最簡便的方法就是增加serializable屬性標記類。如:
    [serializable()]
    public class meablock
    {
        private int m_id;
        public string caption;

        public meablock()
        {
            ///構造函數
        }
    }
    即可實現該類的可序列化。
    要將該類的實例序列化為到文件中?.net framework提供了兩種方法:
    1、xml序列化
        使用 xmlserializer 類,可將下列項序列化。
  • 公共類的公共讀/寫屬性和字段
  • 實現 icollection 或 ienumerable 的類。(注意只有集合會被序列化,而公共屬性卻不會。)
  • xmlelement 對象。
  • xmlnode 對象。
  • dataset 對象。

         要實現上述類的實例的序列化,可參照如下例子:
        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到記憶類,演變成序列化保存該記憶類的操作。
        反序列化是一個逆過程。將數據流反序列化成為該記憶類,再根據該記憶類的屬性生成控件實例。而對于控件的一些事件、方法則可以繼續使用。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 滨海县| 邵武市| 深泽县| 保康县| 松潘县| 商水县| 黄山市| 新余市| 黄陵县| 仁怀市| 菏泽市| 临洮县| 金阳县| 江孜县| 阜新市| 桂阳县| 阜平县| 油尖旺区| 梁山县| 迭部县| 平凉市| 古交市| 孝义市| 云安县| 屯昌县| 平邑县| 巩留县| 纳雍县| 融水| 长春市| 苍山县| 南陵县| 尼勒克县| 江阴市| 凤凰县| 乐亭县| 怀柔区| 洮南市| 常德市| 汾西县| 喀喇沁旗|