乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      琳婕小筑- 學(xué)習(xí)Duwamish 7.0筆記 -

       liuqg 2006-03-10
      水粉文字特效制作
      未知 學(xué)習(xí)Duwamish 7.0筆記    [ 日期:2005-01-07 ]   [ 來自:chyich ]

      一、Duwamish 7.0的架構(gòu)
      Duwamish 7.0是vs.net中微軟提供的一個(gè)企業(yè)級(jí)的示例,最近在學(xué)設(shè)計(jì)方面的東西,所以有時(shí)間邊看邊學(xué)這個(gè)示例。做了一些筆記,和大家一起討論。
          學(xué)習(xí)Duwamish 7.0,首先要看的當(dāng)然是它的一個(gè)整體的結(jié)構(gòu)式,在msdn自帶的幫助文件中,我們看到了它的一個(gè)整體的結(jié)構(gòu),如下圖所示:
       
      Duwamish 7.0分為四層,分別為:
      l    Web層
      相當(dāng)于是用戶界面層,直接與用戶交互的web窗體,從源碼中我們可以看到,它有以下的一些界面頁:
      頁面名稱    作用
      book.aspx    用以顯示圖書的詳細(xì)信息的頁面
      default.aspx    默認(rèn)頁,顯示當(dāng)天的精選書
      categories.aspx    用于分類顯示圖書的頁面,它由兩部分組成,上半部分顯示當(dāng)天推薦的該分類的圖書信息,下半部分顯示該分類的
      errorpage.aspx    是一個(gè)靜態(tài)頁面,顯示一成不變的錯(cuò)誤信息
      searchresults.aspx    顯示搜索結(jié)果頁面,用了一個(gè)datalist控件顯示搜索的結(jié)果;不支持分頁
      shoppingcart.aspx    購物車頁,用于填寫購書的訂單,用datagrid控件操作,支持批量修改和更新。不支持刪除,設(shè)為零時(shí)能刪除;不用單擊update按鈕就自動(dòng)更新了;update按鈕用于修改訂購書的數(shù)量后刷新價(jià)格。
      viewsource.aspx    既然是示例,當(dāng)然可以看源代碼了,這一頁是專門用于查看源代碼的


      下面的頁面是用于管理用戶及用戶訂單系統(tǒng),微軟專門把它放在secure文件夾下:
      頁面名稱    作用
      account.aspx    新客戶注冊(cè)頁及客戶修改個(gè)人信息頁;
      checkout.aspx    確認(rèn)購買頁面,填寫收貨人的詳細(xì)地址和聯(lián)系方式,填入信用卡的信息,列出購買的清單及總的費(fèi)用信息。
      order.aspx    顯示用戶的訂單信息,以供用戶打印該訂單

      在Duwamish 7.0中,大量的運(yùn)用了用戶控件,各個(gè)用戶控件的功能不一,用戶控件統(tǒng)一放在modules文件夾下:
      用戶控件名稱    作用
      accountmodule.ascx    對(duì)應(yīng)于account.aspx頁面,新客戶注冊(cè)頁及客戶修改個(gè)人信息
      bannermodule.ascx    每一頁都包含有該用戶控件,它定義的頁面的頭部信息,在頁面中看到的頭上的哪片黑色的區(qū)域就是它了,包含一個(gè)圖片,三個(gè)按鈕。
      categoriesmodule.ascx    每一頁都包含有該用戶控件,它顯示了書籍的分類信息。在頁面的左邊的”Browse Categories”文字開始到” Behind The Scenes”文字結(jié)束就是該控件的界面內(nèi)容了
      checkoutmodule.ascx    對(duì)應(yīng)于checkout.aspx頁,因?yàn)閏heckout.aspx頁是一個(gè)按步驟操作的頁(用panel控件控制),每走一頁,checkoutmodule.ascx控件中的箭頭就往前走或往后退一格。在父頁面中通過控制checkoutmodule.ascx控件的Stage屬性來控制
      dailypickmodule.ascx    用于顯示推薦的圖書信息,在default.aspx頁和categories.aspx頁中用到
      searchmodule.ascx    搜索功能控件,每頁的搜索功能都由這個(gè)控件實(shí)現(xiàn)
      viewsourcemodule.ascx    查看源碼功能控件,每頁的查看源功能都是由這個(gè)用戶控件實(shí)現(xiàn)

      所有用戶界面層就是上述的頁面和用戶控件,看起來其實(shí)也不多。

      l    業(yè)務(wù)外觀層
      什么是業(yè)務(wù)外觀層,這是四層結(jié)構(gòu)里面新增的東西?有什么用呢?現(xiàn)在我也不知道,先讓我們看看Duwamish 7.0中業(yè)務(wù)層中包含一些什么?打開BusinessFacade項(xiàng)目,這里面的東西就是Duwamish 7.0業(yè)務(wù)外觀層了,看看里面有下面的這些文件組成:
      文件名稱    類作用
      CustomerSystem.cs    CustomerSystem類是客戶系統(tǒng)的業(yè)務(wù)外觀層,它為客戶子系統(tǒng)提供了一個(gè)簡(jiǎn)單的接口,該類支持遠(yuǎn)程處理的應(yīng)用程序中跨應(yīng)用程序域邊界訪問。它繼承自MarshalByRefObject類。從Duwamish 7.0中提供的visio圖上看,CustomerSystem類只有三個(gè)方法,分別是:GetCustomerByEmail方法(從email和密碼獲得客戶的信息),UpdateCustomer方法(更新客戶的信息,接收一個(gè)CustomerData對(duì)象),CreateCustomer方法(當(dāng)然是用于創(chuàng)建一個(gè)新的客戶了)
      OrderSystem.cs    OrderSystem類用于處理訂單的業(yè)務(wù)外觀,它只有兩個(gè)方法:GetOrderSummary方法(用于統(tǒng)計(jì)訂單),AddOrder方法(用于新增一個(gè)訂單)
      ProductSystem.cs    ProductSystem類用于處理書的業(yè)務(wù)外觀,它的方法比較多,有五個(gè)分別是:GetCategories方法(通過分類的id獲得類別自身的信息);GetCategoryItems方法(通過分類的id獲得該類下的所有的書的信息);GetDailyPickItems方法(通過分類的id獲得該類下的推薦書的信息);GetItemById方法(通過書的id獲得有關(guān)書的信息);GetSearchItems方法(根據(jù)指定的檢索字段條件以及書名的關(guān)鍵字查詢書的信息)
          
          看了上面業(yè)務(wù)層的類以后,我們發(fā)現(xiàn)所有的業(yè)務(wù)層類都只有方法,沒有屬性,我的理解是它是所有與用戶界面有關(guān)的操作的一些方法的定義。
          這兩天又到微軟中國網(wǎng)站上看看,發(fā)現(xiàn)了盧彥寫的幾篇關(guān)于Duwamish 7.0的文章其中的一篇就是有關(guān)為什么要加業(yè)務(wù)外觀層的,看了后,才完全理解,下面我們來看看盧彥的這篇文章的片斷:
          在Web應(yīng)用程序中,有部分操作只是簡(jiǎn)單的從數(shù)據(jù)庫根據(jù)條件提取數(shù)據(jù),不需要經(jīng)過任何處理,而直接將數(shù)據(jù)顯示到網(wǎng)頁上,比如查詢某類別的圖書列表。而另外一些操作,比如計(jì)算定單中圖書的總價(jià)并根據(jù)顧客的級(jí)別計(jì)算回扣等等,這部分往往有許多不同的功能的類,操作起來也比較復(fù)雜。我們可以先想象一下,如果我們采用三層結(jié)構(gòu),這些商業(yè)邏輯一般是會(huì)放在中間層,那么對(duì)內(nèi)部的這些大量種類繁多,使用方法也各異的,不同的類的調(diào)用任務(wù)就完全落到了表示層。這樣勢(shì)必會(huì)增加表示層的代碼量,將表示層的任務(wù)復(fù)雜化,和表示層只負(fù)責(zé)接受用戶的輸入并返回結(jié)果的任務(wù)不太相稱,并增加了層與層之間的耦合程度。
          為了解決這個(gè)問題,我們先來看看《設(shè)計(jì)模式》一文中對(duì)Facade模式的描述:
      意圖:
          為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,F(xiàn)acade模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。
      適用性:
          當(dāng)你要為一個(gè)復(fù)雜子系統(tǒng)提供一個(gè)簡(jiǎn)單接口時(shí)。子系統(tǒng)往往因?yàn)椴粩嘌莼兊迷絹碓綇?fù)雜。大多數(shù)模式使用時(shí)都會(huì)產(chǎn)生更多更小的類。這使得子系統(tǒng)更具可重用性,也更容易對(duì)子系統(tǒng)進(jìn)行定制,但這也給那些不需要定制子系統(tǒng)的用戶帶來一些使用上的困難。Facade可以提供一個(gè)簡(jiǎn)單的缺省視圖,這一視圖對(duì)大多數(shù)用戶來說已經(jīng)足夠,而那些需要更多的可定制性的用戶可以越過Facade層。 
          客戶程序與抽象類的實(shí)現(xiàn)部分之間存在著很大的依賴性。引入Facade將這個(gè)子系統(tǒng)與客戶以及其他的子系統(tǒng)分離,可以提高子系統(tǒng)的獨(dú)立性和可移植性。 
          當(dāng)你需要構(gòu)建一個(gè)層次結(jié)構(gòu)的子系統(tǒng)時(shí),使用Facade模式定義子系統(tǒng)中每層的入口點(diǎn)。如果子系統(tǒng)之間是相互依賴的,你可以讓它們僅通過Facade進(jìn)行通訊,從而簡(jiǎn)化了它們之間的依賴關(guān)系。 
      結(jié)構(gòu)圖:
       
      上文提出的這個(gè)矛盾,正好和設(shè)計(jì)模式中Facade模式中所描述的需要解決的問題非常吻合,在《設(shè)計(jì)模式》中提出的解決的辦法就是引入一個(gè)Facade對(duì)象,讓這個(gè)Facade來負(fù)責(zé)管理系統(tǒng)內(nèi)部類的調(diào)用,并為表示層提供了一個(gè)單一而簡(jiǎn)單的接口。這個(gè)Facade對(duì)象,在我們的Duwamish的設(shè)計(jì)中,就是BusinessFacade(業(yè)務(wù)外觀)層。

      l    業(yè)務(wù)規(guī)則層
      業(yè)務(wù)規(guī)則層包含各種業(yè)務(wù)規(guī)則和邏輯的實(shí)現(xiàn),在Duwamish 7.0中業(yè)務(wù)規(guī)則層完成如客戶帳戶和書籍訂單的驗(yàn)證這樣的任務(wù)。它包含了兩個(gè)類:
      文件名稱    類作用
      Customer.cs    它有一個(gè)私有的常量REGEXP_ISVALIDEMAIL,用于驗(yàn)證客戶的輸入的email地址是否正確;insert方法用于驗(yàn)證和新建一條客戶記錄;update方法用于更新某個(gè)客戶的信息;GetCustomerByEmail私有方法通過email驗(yàn)證是否已存在該客戶的信息;Validate私有方法用于驗(yàn)證customer數(shù)據(jù)是否正確,它通過調(diào)用類內(nèi)的IsValidEmail(驗(yàn)證email方法)和IsValidField(驗(yàn)證字段的內(nèi)容是否超長(zhǎng)字段規(guī)定的長(zhǎng)度)來驗(yàn)證整個(gè)customer對(duì)象是否正確
      Order.cs    私有的常量MINIMUM_SHIPPING_CHARGE,私有的常量STANDARD_ITEM_COUNT。CalculateTax方法用于計(jì)算稅收。CalculateShipping用于計(jì)算購物的總價(jià)格。InsertOrder方法用于插入一個(gè)訂單;IsValidField用于驗(yàn)證字段的正確性

          從上面的兩個(gè)類設(shè)計(jì)來看,業(yè)務(wù)邏輯層的功能是對(duì)業(yè)務(wù)對(duì)象是否符合業(yè)務(wù)邏輯的驗(yàn)證,無需驗(yàn)證的對(duì)象則無需寫其業(yè)務(wù)層,從業(yè)務(wù)外觀層我們看到,CustomerSystem.類對(duì)應(yīng)于Customer類,它對(duì)CustomerSystem.提交的CustomeData對(duì)象進(jìn)行驗(yàn)證。Order類則對(duì)OrderSystem類提交的OrderData對(duì)象進(jìn)行驗(yàn)證。但是我們看到?jīng)]有對(duì)ProductSystem類的驗(yàn)證的對(duì)象,這是因?yàn)樵贒uwamish 7.0中沒有提供對(duì)product(在這里是指書)對(duì)象的更新或新增操作。我想,如果它提供了對(duì)書的維護(hù)功能的話,它也肯定有這個(gè)業(yè)務(wù)規(guī)則對(duì)象。
          原文請(qǐng)看:http://www.microsoft.com/china/community/ ... icle/TechDoc/duwamish.asp
      l    數(shù)據(jù)訪問層
      數(shù)據(jù)訪問層負(fù)責(zé)對(duì)業(yè)務(wù)層提供數(shù)據(jù)操作,也就是它負(fù)責(zé)和底層的數(shù)據(jù)庫打交道。業(yè)務(wù)層或者通用層中所有的對(duì)象都通過數(shù)據(jù)訪問層的對(duì)象訪問數(shù)據(jù)庫。數(shù)據(jù)訪問層中的類是按業(yè)務(wù)對(duì)象來組織的,每個(gè)業(yè)務(wù)對(duì)象中包含的數(shù)據(jù)可能存在不同的幾種數(shù)據(jù)表中,它由數(shù)據(jù)訪問類統(tǒng)一組織成一個(gè)概念中的對(duì)象,它相當(dāng)于是一個(gè)面向?qū)ο蟮臄?shù)據(jù)庫層,負(fù)責(zé)映射面向?qū)ο笈c關(guān)系數(shù)據(jù)庫間的關(guān)系。
      對(duì)數(shù)據(jù)庫的所有操作均由存儲(chǔ)過程完成,數(shù)據(jù)層只是在前臺(tái)調(diào)用后臺(tái)的存儲(chǔ)過程。
      文件名稱    類作用
      Books.cs    Books類有許多的方法,構(gòu)造函數(shù)Books首先創(chuàng)建了一個(gè)SqlDataAdapter對(duì)象,然后指定了該對(duì)象的SqlConnection對(duì)象。Books類實(shí)現(xiàn)了Idisposable接口,實(shí)現(xiàn)的Dispose方法,用于銷毀該對(duì)象。下面的各個(gè)方法都是根據(jù)不同的參數(shù)獲得BookData,包括:GetBooksByCategorId(對(duì)應(yīng)于同名的存儲(chǔ)過程,通過類別id獲得bookdata數(shù)據(jù)集對(duì)象),GetDailyPickBooksByCategoryId(對(duì)應(yīng)于同名的存儲(chǔ)過程,通過類別id獲得推薦的bookdata數(shù)據(jù)集對(duì)象),GetBookById(通過書的id取得書的信息),GetBooksByAuthor(通過作者名獲得書的信息,可能有N條記錄),GetBooksByISBN(通過isbn獲得書的信息),GetBooksBySubject,GetBooksByTitle,上述的方法其它都是通過FillBookData(通過傳進(jìn)行存儲(chǔ)過程名作參數(shù)和參數(shù)值執(zhí)行SqlDataAdapter對(duì)象的fill方法填充bookdata對(duì)象)方法執(zhí)行對(duì)應(yīng)的存儲(chǔ)過程來獲得BookData。
      Categories.cs    Categories類的方法比較少,除了構(gòu)造函數(shù)和dispose方法外,就只有GetCategories方法(通過分類的id獲得該類的父、本、子三級(jí)的分類對(duì)象)和FillCategoryData私有方法(為GetCategories方法從底層數(shù)據(jù)庫中獲取數(shù)據(jù)到CategoriesData)。
      Customers.cs    Customers類除了構(gòu)造函數(shù)和dispose方法外,有三個(gè)公開的方法,LoadCustomerByEmail方法(調(diào)用GetLoadCommand方法,獲得sqlcommand對(duì)象后,執(zhí)行GetCustomerByEmail存儲(chǔ)過程,獲得customerdata對(duì)象),UpdateCustomer方法(更新整個(gè)的customer對(duì)象,在UpdateCustomer存儲(chǔ)過程中又調(diào)用了UpdateCustomerAddress存儲(chǔ)過程來更新Addresses表。它有一個(gè)缺點(diǎn)就是每次更都會(huì)完全的更新兩張表的所有的內(nèi)容),InsertCustomer(與UpdateCustomer方法類似,它調(diào)用InsertCustomer和InsertAddress兩個(gè)存儲(chǔ)過程完成兩個(gè)表的插入工作,唯一不同的插入操作是先插入主表,然后再插入從表。更新是先從表,后主表。),及三個(gè)私有的為前三個(gè)公開的方法服務(wù)的方法。GetLoadCommand方法(生成調(diào)用GetCustomerByEmail存儲(chǔ)過程的sqlcommand命令返回),GetInsertCommand(生成調(diào)用InsertCustomer存儲(chǔ)過程的sqlcommand命令返回,它用了sqlparameter對(duì)象的sourcecolumn屬性映射對(duì)dataset的某個(gè)對(duì)象),GetUpdateCommand(它與GetInsertCommand方法類似)。
      Orders.cs    Orders除了構(gòu)造函數(shù)和dispose方法外,也只有一個(gè)公開的方法InsertOrderDetail方法(插入一個(gè)訂單到數(shù)據(jù)庫,詳細(xì)的說明看源碼注釋)及一個(gè)私有方法GetInsertCommand(初始化DataAdapter對(duì)象的Insert命令參數(shù)集)

      l    通用層
      映射關(guān)系數(shù)據(jù)庫表到實(shí)際應(yīng)用的類(對(duì)象)層。相當(dāng)于是一個(gè)面向?qū)ο蟮臄?shù)據(jù)庫層,把物理的數(shù)據(jù)庫表的字段映射成業(yè)務(wù)對(duì)象:
      文件名稱    類作用
      BookData.cs    BookData類繼承自dataset類,創(chuàng)建了一個(gè)datatable表,用于存儲(chǔ)書的數(shù)據(jù)。支持序列化。(序列化有什么用?它沒有聲明authors字段,但填充的時(shí)卻有這個(gè)字段?)
      CategoryData.cs     CategoryData類繼承自dataset類,創(chuàng)建了一個(gè)datatable表,用于存儲(chǔ)書分類的數(shù)據(jù)。支持序列化。
      CustomerData.cs    CustomerData類繼承自dataset類,創(chuàng)建了一個(gè)datatable表,用于存儲(chǔ)書的數(shù)據(jù)。支持序列化。
      OrderData.cs    OrderData類也繼承自dataset類,但它包含了五個(gè)表,各個(gè)表字段不一樣。

      l    系統(tǒng)架構(gòu)層
      文件名稱    類作用
      ApplicationConfiguration    
      DuwamishConfiguration    

      太亂了,我把《項(xiàng)目總結(jié)》系列和這個(gè)打成包,要的,留個(gè)email!

      三、編程技巧學(xué)習(xí)
      1.    存儲(chǔ)過程技巧
      1)    輸出參數(shù)可以當(dāng)輸入?yún)?shù)使用
      2)    字符串字段的累加的方法
      我們看看GetBookById存儲(chǔ)過程的一段源碼:
      PROCEDURE GetBookById
          @BookId INT
      AS
          -- max size = 10 Authors
          DECLARE @AuthorList nvarchar(480)

          SET NOCOUNT ON

          -- initialize @AuthorList
          SELECT @AuthorList = ""

          -- build list of authors
          SELECT @AuthorList = @AuthorList + a.Name + ", "
            FROM Books b, 
                 BookAuthor ba, 
                 Authors a
           WHERE b.ItemId = @BookId
             AND ba.ItemId = b.ItemId
             AND a.PKId = ba.AuthorId

      -- remove last comma
       SELECT @AuthorList = LEFT(@AuthorList,LEN(@AuthorList) - 1)

            把這段單獨(dú)拷出來,在查詢分析器運(yùn)行,我們發(fā)現(xiàn)這段是用來取某本書的作者的列表,一本書可能有多個(gè)作者,
      SELECT @AuthorList = @AuthorList + a.Name + ", "
            FROM Books b, 
                 BookAuthor ba, 
                 Authors a
           WHERE b.ItemId = @BookId
             AND ba.ItemId = b.ItemId
                             AND a.PKId = ba.AuthorId
          就是把書的作者名一個(gè)個(gè)取出來,累加到@AuthorList變量中,各個(gè)作者用逗號(hào)隔開,最后一句SELECT @AuthorList = LEFT(@AuthorList,LEN(@AuthorList) - 1)把最后一個(gè)作者后的逗號(hào)去掉。
      3)    存儲(chǔ)過程參數(shù)與dataset中字段的映射
      在Customers類中的GetInsertCommand方法中,我們看到了下面的代碼:
      sqlParams[PKID_PARM].SourceColumn = CustomerData.PKID_FIELD;
                          sqlParams[PKID_PARM].Direction = ParameterDirection.Output; 

      sqlParams[EMAIL_PARM].SourceColumn = CustomerData.EMAIL_FIELD;
              它運(yùn)用了sqlparameter對(duì)象的SourceColumn屬性,該屬性用于指定sqlparameter對(duì)象的值與dataset中字段的映射。它是雙向,即是輸入值,也是輸出值。sqlParams[EMAIL_PARM].SourceColumn = CustomerData.EMAIL_FIELD;這一句表示把CustomerData(dataset對(duì)象)的EMAIL_FIELD字段值映射成sqlParams[EMAIL_PARM]的參數(shù)值。
      4)    
      2.    Web 編程技巧
      1)    運(yùn)用ado.net中的dataview對(duì)已存在結(jié)果集進(jìn)行再查詢
      在cart類的AddItem方法中我們可看到源碼:
      public void AddItem(int itemId, String itemDescription, Decimal itemPrice)
              {
                  DataTable itemTable = OrderItems;
                  DataView itemSource = new DataView(itemTable);
              
                  //search for item, check to see if the item has already been ordered
                  //通過itemid查找item,檢查是否已預(yù)定該item,利用DataView的RowFilter屬性,設(shè)置其過濾條件。
                  //接下來用DataView的count屬性執(zhí)行查詢并返回滿足條件的記錄數(shù)
                  itemSource.RowFilter = "ItemNumber = " + itemId.ToString();
                  
                  //如果已經(jīng)訂了該書,增加數(shù)量
                  if (itemSource.Count > 0)
                  {
                      DataRowView sourceRow = itemSource[0];
                      short count = (short)(sourceRow[OrderData.QUANTITY_FIELD]);
                      //maximum allowed for any specific item is 50
                      //每種書最多允許訂50本
                      if (count < 50)
                      {
                          //bump the quantity by one
                          //訂購書本的數(shù)量加一,更新orderdata對(duì)象(數(shù)量,總價(jià))
                          count += 1;
                          sourceRow[OrderData.QUANTITY_FIELD] = count;
        sourceRow[OrderData.EXTENDED_FIELD] = (Decimal)sourceRow[OrderData.PRICE_FIELD] * count;
                      }
                  }
                  //先前沒有訂該書
                  else
                  {
              
                      //It‘s a new item
                      //在orderdata里面新增一條記錄
                      DataRow itemRow = itemTable.NewRow();
                      itemRow[OrderData.ITEM_NUMBER_FIELD] = itemId;
                      itemRow[OrderData.QUANTITY_FIELD] = 1;
                      itemRow[OrderData.DESCRIPTION_FIELD] = itemDescription;
                      itemRow[OrderData.PRICE_FIELD] = itemPrice;
                      itemRow[OrderData.EXTENDED_FIELD] = itemPrice;
              
                      //Add it to the table
                      itemTable.Rows.Add(itemRow);
      }
      }
      3.系統(tǒng)配置技巧
      4.    其它
      1)    對(duì)象的序列化
      在cart類中,我們可以看到該類實(shí)現(xiàn)了Iserializable接口,首先我們了解一下什么是序列化,我以前也沒有接觸過,所以上網(wǎng)查了一下,在微軟的網(wǎng)站中找到了這篇文章---.NET 中的對(duì)象序列化(原文網(wǎng)址:http://www.microsoft.com/china/msdn/ ... t/html/objserializ.asp)。為什么要使用序列化?最重要的兩個(gè)原因是:將對(duì)象的狀態(tài)保存在存儲(chǔ)媒體中以便可以在以后重新創(chuàng)建出完全相同的副本;按值將對(duì)象從一個(gè)應(yīng)用程序域發(fā)送至另一個(gè)應(yīng)用程序域。例如,序列化可用于在 ASP.NET 中保存會(huì)話狀態(tài),以及將對(duì)象復(fù)制到 Windows 窗體的剪貼板中。它還可用于按值將對(duì)象從一個(gè)應(yīng)用程序域遠(yuǎn)程傳遞至另一個(gè)應(yīng)用程序域。
      序列化是指將對(duì)象實(shí)例的狀態(tài)存儲(chǔ)到存儲(chǔ)媒體(例如說硬盤)的過程。在此過程中,先將對(duì)象的公共字段和私有字段以及類的名稱(包括類所在的程序集)轉(zhuǎn)換為字節(jié)流,然后再把字節(jié)流寫入數(shù)據(jù)流。在隨后對(duì)對(duì)象進(jìn)行反序列化時(shí),將創(chuàng)建出與原對(duì)象完全相同的副本。
      要實(shí)現(xiàn) ISerializable,需要實(shí)現(xiàn) GetObjectData 方法以及一個(gè)特殊的構(gòu)造函數(shù),在反序列化對(duì)象時(shí)要用到此構(gòu)造函數(shù)。我們看看在眼里cart類的持殊的構(gòu)造函數(shù):
      private Cart(SerializationInfo info, StreamingContext context)
              {
                  try
                  {
                      cartOrderData = (Common.Data.OrderData)info.GetValue(KEY_ORDERDATA, typeof(Common.Data.OrderData));
                  }
                  catch
                  {
                      // Leave cartOrderData null if it hasn‘t been serialized
      }
       }
                    這個(gè)構(gòu)造函數(shù)在反序列化的時(shí)候被調(diào)用,用于從磁盤中獲得OrderData對(duì)象。
      再看看GetObjectData 方法的代碼:
      void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
              {
                  if (cartOrderData != null)
                  {
                      info.AddValue(KEY_ORDERDATA, cartOrderData);
                  }
              }
      該方法把cartOrderData對(duì)象序列化,也就相同于把它存到磁盤了。在反序列化,也就是調(diào)用上面的那個(gè)構(gòu)造函數(shù),再把它從磁盤中取出來。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多