使我們的對象可序列化 為在 ASP.NET 中使用可繪制對象類,我們需要對其再進行一項更改。這些類需要是可序列化的,以便能夠在主要的 Web 頁和生成該圖像的 Web 頁之間傳遞數據(后面將詳述)。序列化是這樣的過程:將某個類的數據以某種方式寫入存儲介質,以便存儲和/或傳遞數據并在以后反序列化。反序列化是從序列化數據中重新創建對象的過程。我們會在將來的專欄中深入討論這個問題。 Dr. GUI 最開始作為 Windows 窗體應用程序編寫此應用程序時,只使用了 .NET Framework 和操作系統預先分配的 Brushes 和 Pens 類中的可用常用畫筆和筆。因為這些已經分配完畢,保持對它們的引用不會有任何妨礙,同時也無需對其進行 Dispose。 但由于筆和畫筆是非常復雜的對象,不能是可序列化的,因此 Dr. GUI 必須改變其策略,轉而決定存儲筆和畫筆的顏色,然后在需要繪制和填充對象時動態創建筆和畫筆。 如何使之可序列化? 序列化是 .NET Framework 的一個重要部分,因此也使序列化對象的工作變得很簡單。 我們只需使用 Serializable 屬性標記一個類便可使之可序列化。(這與我們以前用于在枚舉上將其標記為一套標志的屬性是同一種屬性。)在 C# 和 Visual Basic .NET 中的語法如下所示: C# [Serializable] class Foo // ... Visual Basic .NET _ Class Foo ' ... 注意:除了將類標記為可序列化外,還必須使類中包含的所有數據可序列化,否則在試圖序列化數據時,序列化框架會引發一個異常。 使容器可序列化 .NET Framework 的一大優點是可以使容器類可序列化。這意味著如果將對象存儲在可序列化的容器中,容器可以自動序列化對象。 因此在本例中,DShapeList 類包含了兩個 ArrayList 對象。由于 ArrayList 是可序列化的,因此要使 DShapeList 可序列化,只需將其標記為 Serializable 屬性即可,如下所示: Visual Basic .NET _ Public Class DShapeList Dim wholeList As New ArrayList() Dim filledList As New ArrayList() ' ... C# [Serializable] public class DShapeList { ArrayList wholeList = new ArrayList(); ArrayList filledList = new ArrayList(); 假設我們放在 DShapeList 中的對象都是可序列化的,這時便可以使用單個語句序列化和反序列化整個列表! 順便說一下,這對于該應用程序的 Windows 窗體版本也是一個很好的改變,因為它使我們能夠將繪圖寫入磁盤文件并重新加載。 可繪制對象的三個版本;任何一個都可以在任何上下文中使用 您可能已經注意到,我們有三種版本的可繪制對象代碼:在 C# 和 Visual Basic .NET 中各有一個不使用我們在上面編寫的 helper 方法的版本,另一個是 Visual Basic .NET 中使用 helper 方法的版本。 在這里還有一點微小的差別:使用 helper 的文件中的數據類被標記為可序列化;其他文件中的數據類則沒有標記為可序列化。 但是,請注意下面很重要的一點:如果我們返回去并將所有文件中的數據類標記為可序列化,那么將能夠在任何應用程序中使用任何類。我們將能夠混合使用 C# 和 Visual Basic .NET。并且能夠在 ASP.NET 應用程序中使用最初為 Windows 窗體應用程序編寫的代碼。 這種簡便的代碼重用意味著您編寫的代碼更具價值,因為代碼可以在很多不同的環境中重復使用。
|