實現業務實體
業務實體具有以下特點
業務實體提供對業務數據及相關功能(在某些設計中)的狀態編程訪問
業務實體可以使用具有復雜架構的數據來構建
業務實體數據可以作為業務過程的部分 I/O 參數傳遞
業務實體可以是可序列化的
業務實體不直接訪問數據庫
業務實體不啟動任何類型的事務處理
如本文前面所述
XML
通用 DataSet
有類型的 DataSet
自定義業務實體組件
帶有 CRUD 行為的自定義業務實體組件
以下各節將介紹如何使用這些格式來表示業務實體
組織業務實體集合
將業務實體數據綁定到用戶界面控件
序列化業務實體數據
在層間傳遞業務實體數據
以下各節還針對非功能性要求(包括性能
以下示例顯示了如何將一個簡單的業務實體表示為 XML
<Product xmlns=
<ProductID>
<ProductName>Chai</ProductName>
<QuantityPerUnit>
<UnitPrice>
<UnitsInStock>
<UnitsOnOrder>
<ReorderLevel>
</Product>
當使用 XML 表示業務實體數據時
確定 XML 文檔是包含單個業務實體還是包含一個業務實體集合
使用一個命名空間唯一標識該 XML 文檔
為元素和屬性選擇合適的名稱
使用以下方法之一以 XML 格式檢索您的業務實體
如果您使用的是 SQL Server
檢索 DataSet 並將其轉換為 XML 流或以 XML 流的格式寫出
使用輸出參數或數據讀取器構建一個 XML 文檔
將業務實體表示為 XML 的優點如下
標准支持
靈活性
互操作性
將業務實體表示為 XML 的缺點如下
類型保真
驗證 XML
顯示 XML
分析 XML
排序 XML
按預先排好的順序提供數據
應用 XSLT 樣式表動態排序數據
將 XML 數據轉換為 DataSet
使用專用字段
通用 DataSet 是 DataSet 類的實例
圖
圖
圖
圖
以下代碼顯示了如何從數據訪問邏輯組件檢索通用 DataSet
ProductDALC dalcProduct = new ProductDALC();
// 對 ProductDALC 調用一個方法以獲取一個包含全部產品信息的 DataSet
DataSet dsProducts = dalcProduct
// 在客戶端中使用 DataSet
dataGrid
dataGrid
// 然後
// 保存到數據庫
dalcProduct
您還可以在運行時查詢和修改 DataSet 中的表
將業務實體表示為通用 DataSet 的優點如下
靈活性
序列化
數據綁定
排序與過濾
與 XML 的互換性
元數據的可用性
開放式並發
可擴展性
將業務實體表示為通用 DataSet 的缺點如下
客戶端代碼必須通過 DataSet 中的集合訪問數據
// 獲取所調用的名為 dsProducts 的 DataSet 的第一行的
// 產品名稱
String str = (String)dsProducts
注意這裡沒有這些索引生成器的編譯時檢查 如果指定一個無效的表名稱 列名稱或列類型 會在運行時捕獲該錯誤 使用通用 DataSet 時不支持 IntelliSense
實例化和封送處理的成本很高
專用字段
有類型的 DataSet 是包含具有嚴格類型的方法
下面列出了有類型的 DataSet 與通用 DataSet 相比的優缺點
將業務實體表示為有類型的 DataSet 的優點如下
代碼易讀
// 獲取所調用的名為 dsProducts 的有類型的 DataSet 的第一行的
// 產品名稱
String str = dsProducts
在本示例中
有類型的方法和屬性的提供使得使用有類型的 DataSet 比使用通用 DataSet 更方便
編譯時類型檢查
將業務實體表示為有類型的 DataSet 的缺點如下
部署
支持企業服務 (COM+) 調用程序
可擴展性問題
實例化
繼承
定義自定義業務實體組件
表示業務實體的自定義類通常包含以下成員
用於在本地緩存業務實體的數據的專用字段
用於訪問實體的狀態和訪問實體內數據的子集及層次結構的公共屬性
用以使用實體組件中的數據執行本地化處理的方法和屬性
用以通知實體組件內部狀態變化的事件
圖
圖
定義自定義業務實體組件的建議
在實現自定義實體組件時
選擇使用結構還是使用類
表示業務實體的狀態
表示自定義業務實體組件中的子集合和層次結構
DataSet
支持用戶界面客戶端的數據綁定
Windows 窗體中的數據綁定
Web 窗體中的數據綁定
公開內部數據更改的事件
使業務實體可序列化
使用 XmlSerializer 類進行 XML 序列化
您可以對業務實體執行 XML 序列化而無需在實體中實現任何附加代碼
使用 BinaryFormatter 或 SoapFormatter 類進行格式序列化
格式類將序列化對象的所有公共和專用字段及屬性
注意還原序列化某個對象時 不會調用默認的構造函數 對還原序列化添加這項約束 是出於性能方面的考慮
定義自定義實體的優點如下
代碼易讀
ProductDALC dalcProduct = new ProductDALC();
// 使用該 ProductDALC 對象創建和填充一個 ProductEntity 對象
// 此代碼假設 ProductDALC 類有一個名為 GetProduct 的方法
// 該方法使用 Product ID 作參數(本例中為
// 包含該產品的所有數據的 ProductEntity 對象
ProductEntity aProduct = dalcProduct
// 更改該產品的產品名稱
aProduct
在上述示例中
封裝
aProduct
在上述示例中
構建復雜系統的模型
本地化驗證
專用字段
定義自定義實體的缺點如下
業務實體集合
序列化
表示業務實體中的復雜關系和層次結構
搜索和排序數據
部署
支持企業服務 (COM+) 客戶端
可擴展性問題
定義帶有 CRUD 行為的自定義業務實體組件
在定義一個自定義實體時
圖
圖
定義帶有 CRUD 行為的自定義實體類的優點如下
封裝
與調用程序的接口
專用字段
定義帶有 CRUD 行為的自定義實體類的缺點如下
處理業務實體集合
開發時間長
表示數據和在層間傳遞數據的建議
在您的應用程序中表示數據的方式以及在層間傳遞數據的方式不一定要相同
應根據自己特定的應用程序要求和操作數據的方式選擇數據格式
如果您的應用程序主要處理集合並需要排序
如果您的應用程序主要處理實例數據
大多數情況下
事務處理
當今的大多數應用程序都需要支持事務處理以保持系統數據的完整性
手動事務處理
自動事務處理
本節提供一些指導原則和建議
實現事務處理
在大多數環境中
然而
在 Customer 表中插入新的一行
在 Address 表中插入新的一行或多行
只有這兩個操作都成功後客戶才會被添加到數據庫中
圖
圖
注意如果從基於 的客戶端進行調用 並且沒有用於啟動事務處理的業務過程 則您可能會從 ASP NET 代碼中啟動該事務處理 這種設計並不好 您決不能從基於 ASP NET 的客戶端啟動事務處理 而應將數據的展示與業務過程相分離 此外 由於網絡滯後等問題還會導致性能問題 因為這是要實際部署在其他層上的最常見的層
在數據訪問邏輯組件中使用手動事務處理的建議
在數據訪問邏輯組件中實現手動事務處理時
盡可能在存儲過程中執行處理
如果沒有使用存儲過程
在數據訪問邏輯組件中使用自動事務處理的建議
雖然 COM+ 事務處理會帶來一些系統開銷
數據訪問邏輯組件必須是從 System
使用 Transaction(TransactionOption
以下代碼示例顯示了如何在數據訪問邏輯組件類中支持自動事務處理
using System
[Transaction(TransactionOption
public class CustomerDALC : ServicedComponent
{
}
如果使用自動事務處理
在業務實體組件中使用自動事務處理
在實現帶有行為的自定義業務實體組件時
注意如果業務實體組件不包含任何要求其在事務處理中表明是否成功的業務邏輯 則它可以忽略事務處理環境 自定義業務實體組件不需要從 ServicedComponent 繼承 事務處理環境仍將繼續其流程 但實體組件將忽略事務處理環境
驗證
您可以在應用程序的許多層上進行數據驗證
在提交數據之前
使用 XSD 架構接收業務文檔時
數據訪問邏輯組件和存儲過程可以驗證數據
常用驗證有兩種
即時點驗證
連續驗證
用戶界面可以指定字段的最大長度以防止用戶輸入過長的字符串
DataSet 可以指定數據列的最大長度
自定義業務實體組件可以對實體數據執行范圍檢查
數據訪問邏輯組件
有時
如何使用 XSD 架構驗證 XML
要使用 XSD 架構驗證 XML 文檔
創建一個 XmlValidatingReader 對象作為 XmlTextReader 對象的包裝
XmlTextReader tr = new XmlTextReader(
XmlValidatingReader vr = new XmlValidatingReader(tr);
通過使用 ValidationType 枚舉指定所需的驗證類型
文檔類型定義 (DTD)
Microsoft XML 精簡數據 (XDR) 架構
W
以下代碼顯示了 ValidationType 枚舉的使用
vr
注冊一個驗證事件處理程序方法
vr
提供一個驗證事件處理程序方法的實現
public void MyHandlerMethod(object sender
{
Console
}
讀取和驗證文檔
try
{
while (vr
{
// 適當處理 XML 數據
}
}
catch (XmlException ex)
{
Console
}
vr
如何在業務實體組件的屬性存取器中驗證數據
以下代碼片段顯示了如何在自定義實體的屬性存取器中進行簡單驗證
public class ProductDALC
{
public short ReorderLevel
{
get { return reorderLevel; }
}
set
{
if (value <
{
throw new ArgumentOutOfRangeException(
}
reorderLevel = value;
}
// 加上 ProductDALC 類中的其他成員
}
異常管理
當 應用程序出現錯誤時
技術異常
ADO
數據庫連接
資源(如數據庫
業務邏輯異常
驗證錯誤
實現業務邏輯的存儲過程中的錯誤 在數據訪問邏輯組件中管理異常的建議
數據訪問邏輯組件應該傳播異常
您的應用程序應當發布異常信息
以下示例說明了這些建議
{
public void UpdateCustomer(Dataset aCustomer)
{
try
{
// 更新數據庫中的客戶
}
catch (SqlException se)
{
// 捕獲並包裝異常
throw new DataAccessException(
}
finally
{
// 清除代碼
}
}
}
在業務實體組件中管理異常的建議
業務實體組件應當向調用程序傳播異常
以下示例顯示了業務實體組件如何產生異常
{
public void Update()
{
// 檢查用戶已提供了所需數據
// 的名字
if (FirstName ==
{
// 發出一個已定義的新的應用程序異常
throw new MyArgumentException(
}
}
}
授權與安全性
本節說明如何將安全性應用於數據訪問邏輯組件和業務實體組件
代碼訪問安全性
身份標識
基於角色的安全性
托管代碼可以使用 Principal 對象(包含對 Identity 對象的引用)來判斷當事人的身份標識或角色
數據訪問邏輯組件的設計目的是供其他應用程序組件使用
通常
在以下情況下
需要與不完全信任的業務過程開發人員共享數據訪問邏輯組件
需要保護對數據存儲提供的強大功能的訪問
在定義了 Identity 對象和 Principal 對象後
使用 PrincipalPermission 對象執行強制性安全性檢查
使用 PrincipalPermissionAttribute 屬性執行說明性安全性檢查
使用 Principal 對象中的屬性和 IsInRole 方法執行顯式安全性檢查
以下代碼示例顯示了如何使用 PrincipalPermissionAttribute 為數據訪問邏輯組件類中的方法指定基於角色的聲明性安全性檢查
using System
public class CustomerDALC
{
public CustomerDALC()
{
}
// 使用 PrincipalPermissionAttribute 要求此方法的調用程序
// 具有一個名為
[PrincipalPermissionAttribute(SecurityAction
Name=
public void DeleteCustomer(string customerID)
{
// 在此處刪除客戶代碼
}
}
以下代碼顯示了如何創建具有所需身份標識和角色的 Principal 對象
using System;
using System
using System
public class MainClass
{
public static int Main(string[] args)
{
Console
string UserName = Console
Console
string Password = Console
if (Password ==
{
// 創建一個名為
GenericIdentity MyIdentity = new GenericIdentity(
// 創建角色
String[] MyString = {
// 創建一個通用當事人
GenericPrincipal MyPrincipal = new GenericPrincipal(MyIdentity
MyString);
// 設置此線程的當前當事人
Thread
}
// 創建一個 CustomerDALC 對象
// 僅在當前當事人的身份標識和角色合格時這一步驟才能成功
CustomerDALC c = new CustomerDALC();
c
}
}
理想情況下
要實現調用應用程序與數據訪問邏輯組件之間的安全通信
如果數據訪問邏輯組件是通過各種層的線路調用的
如果數據是加密存儲在數據庫中
業務實體組件中的安全性建議
如果將業務實體實現為數據結構(如 XML 或 DataSet)
如果將實體提供給您不完全信任的業務過程
業務實體組件不應處理通信安全性或數據加密
部署
本節提供一些建議以幫助您確定如何部署數據訪問邏輯組件和業務實體組件
部署數據訪問邏輯組件
部署數據訪問邏輯組件的方法有兩種
與業務過程對象一起部署數據訪問邏輯組件
事務處理可以在業務過程對象和數據訪問邏輯組件之間無縫流動
一起部署業務過程對象和數據訪問邏輯組件可以減少事務處理失敗節點的數目
安全性環境自動在業務過程對象和數據訪問邏輯組件之間流動
與用戶界面代碼一起部署數據訪問邏輯組件
不與 UI 代碼一起部署數據訪問邏輯組件的一個常見原因是防止通過 Web 領域直接對數據源進行網絡訪問
如果您的 Web 領域部署在 DMZ 環境中
部署業務實體
應用程序的許多不同層都要使用業務實體
部署作為有類型的 DataSet 實現的業務實體
部署作為自定義業務實體組件實現的業務實體
部署作為通用 DataSet 或 XML 字符串實現的業務實體
如何定義數據訪問邏輯組件類
以下代碼示例定義一個名為 CustomerDALC 的類
public class CustomerDALC
{
private string conn_string;
public CustomerDALC()
{
// 從安全或加密的位置獲取連接字符串
// 並將其分配給 conn_string
}
public CustomerDataSet GetCustomer(string id)
{
// 檢索包含 Customer 數據的有類型的 DataSet
}
public string CreateCustomer(string name
string address
string zip)
{
// 根據傳遞給此方法的標量參數
// 新客戶
// 從此方法返回 customerID
}
public void UpdateCustomer(CustomerDataSet updatedCustomer)
{
// 根據作為類型 CustomerDataSet 的參數發送的 Customer 數據
// 數據庫
}
public void DeleteCustomer(string id)
{
// 刪除具有指定 ID 的客戶
}
public DataSet GetCustomersWhoPurchasedProduct(int productID)
{
// 使用通用 DataSet 檢索客戶
// 不需要檢索與客戶關聯的全部信息
}
}
如何使用 XML 表示數據的集合和層次結構
以下示例顯示了如何在 XML 文檔中表示數據的集合和層次結構
<Order xmlns=
<OrderID>
<CustomerID>VINET</CustomerID>
<OrderDate>
<ShippedDate>
<OrderDetails>
<OrderDetail>
<ProductID>
<UnitPrice>
<Quantity>
</OrderDetail>
<OrderDetail>
<ProductID>
<UnitPrice>
<Quantity>
</OrderDetail>
<OrderDetail>
<ProductID>
<UnitPrice>
<Quantity>
</OrderDetail>
</OrderDetails>
</Order>
如何在 應用程序中編程應用樣式表
要在
導入 System
using System
創建一個 XslTransform 對象
XslTransform stylesheet = new XslTransform();
將所需樣式表加載到 XslTransform 對象
stylesheet
調用 XslTransform 對象的 Transform 方法
stylesheet
如何創建有類型的 DataSet
可以使用有類型的 DataSet 表示業務實體
從 Microsoft Visual Studio ®
從 Visual Studio
使用 XSD 架構定義工具 (xsd
注意也可以編程定義有類型的 DataSet 即從 DataSet 繼承並定義方法 屬性和嵌套類以表示該 DataSet 的結構 最簡單的方法是使用以下過程之一創建一個有類型的 DataSet 然後將此有類型的 DataSet 類用作將來您自己的有類型的 DataSet 類的基礎
使用數據適配器創建有類型的 DataSet
要使用數據適配器創建有類型的 DataSet
在 Visual Studio
在組件設計器中
在 Generate DataSet(生成 DataSet)對話框中
為確認已創建該有類型的 DataSet
從 XSD 架構文件創建有類型的 DataSet
要使用 Visual Studio
在 Visual Studio
為項目添加一個現有的 XSD 架構
在解決方案資源管理器中
在組件設計器中選擇主 XSD 架構元素
在 Schema(架構)菜單中
為確認已創建該有類型的 DataSet
使用 XSD 架構定義工具 (xsd
XML 架構定義工具可以從 XSD 架構文件
xsd /dataset /language:C# XsdSchemaFile
如何定義業務實體組件
以下示例顯示了如何為 Product 業務實體定義自定義實體類
public class ProductEntity
{
// 專用字段
private int productID;
private string productName;
private string quantityPerUnit;
private decimal unitPrice;
private short unitsInStock;
private short unitsOnOrder;
private short reorderLevel;
// 公共屬性
public int ProductID
{
get { return productID; }
set { productID = value; }
}
public string ProductName
{
get { return productName; }
set { productName = value; }
}
public string QuantityPerUnit
{
get { return quantityPerUnit; }
set { quantityPerUnit = value; }
}
public decimal UnitPrice
{
get { return unitPrice; }
set { unitPrice = value; }
}
public short UnitsInStock
{
get { return unitsInStock; }
set { unitsInStock = value; }
}
public short UnitsOnOrder
{
get { return unitsOnOrder; }
set { unitsOnOrder = value; }
}
public short ReorderLevel
{
get { return reorderLevel; }
set { reorderLevel = value; }
}
// 執行本地化處理的方法和屬性
public void IncreaseUnitPriceBy(decimal amount)
{
unitPrice += amount;
}
public short UnitsAboveReorderLevel
{
get { return (short)(unitsInStock
}
public string StockStatus
{
get
{
return
}
}
}
如何表示業務實體組件中數據的集合和層次結構
以下示例顯示了如何為 Order 業務實體定義自定義實體類
public class OrderEntity
{
// 專用字段
private int orderID;
private string customerID;
private DateTime orderDate;
private DateTime shippedDate;
// 專用字段
private DataSet orderDetails;
// 公共屬性
public int OrderID
{
get { return orderID; }
set { orderID = value; }
}
public string CustomerID
{
get { return customerID; }
set { customerID = value; }
}
public DateTime OrderDate
{
get { return orderDate; }
set { orderDate = value; }
}
public DateTime ShippedDate
{
get { return shippedDate; }
set { shippedDate = value; }
}
// 公共屬性
public DataSet OrderDetails
{
get { return orderDetails; }
set { orderDetails = value; }
}
// 附加方法
public bool IsProductOrdered(int productID)
{
// 必須在 DataTable 中定義主關鍵字列
DataRow row = orderDetails
if (row != null)
return true;
else
return false;
}
// 附加屬性
public int NumberOfOrderItems
{
get
{
return orderDetails
}
}
}
關於 OrderEntity 類
該類包含用於保存有關訂單的信息的專用字段
該類包含用於提供有關訂單的信息的公共屬性
該類包含一個附加方法和一個附加屬性
IsProductOrdered 方法接收一個 ProductID 參數
NumberOfOrderItems 屬性表明訂單中的訂購行數目
如何將業務實體組件綁定到用戶界面控件
可以將用戶界面控件綁定到 Windows 窗體和 ASP
在用戶界面控件上綁定單個業務實體
OrderDALC dalcOrder = new OrderDALC();
// 使用 dalcOrder 為訂單 ID
// 此代碼假設 OrderDALC 類有一個名為 GetOrder() 的方法
// 該方法為特定訂單 ID 返回一個 OrderEntity 對象
OrderEntity order = dalcOrder
// 將 OrderEntity 的 OrderID 屬性綁定到 TextBox 控件
textBox
// 將 OrderEntity 的 CustomerID 屬性綁定到另一個 TextBox 控件
control
textBox
// 將 OrderEntity 的 OrderDate 屬性綁定到 DatePicker 控件
dateTimePicker
// 將 OrderEntity 的 ShippedDate 屬性綁定到另一個 DatePicker 控件
dateTimePicker
// 將 OrderEntity 的 OrderDetails DataSet 綁定到 DataGrid 控件
// DataGrid 分別用網格中的一行顯示 DataSet 的各個 DataRow
dataGrid
准備好後
// 通過 dalcOrder 將 OrderEntity 對象保存到數據庫中
// 此代碼假設 OrderDALC 類有一個名為 UpdateOrder() 的方法
// 該方法接收一個 OrderEntity 參數
dalcOrder
將業務實體集合綁定到 DataGrid 控件
OrderDALC dalcOrder = new OrderDALC();
// 使用 dalcOrder 獲取客戶
// 此代碼假設 OrderDALC 類有一個名為
GetOrdersForCustomer()
// 的方法
OrderEntity[] orderEntities = dalcOrder
// 將該數組綁定到 DataGrid 控件
dataGrid
准備好後
// 通過 dalcOrder 將 OrderEntity 對象保存到數據庫中
// 此代碼假設 OrderDALC 類有一個名為 UpdateOrder() 的方法
// 一個 OrderEntity 對象數組
dalcOrder
如何在業務實體組件中提供事件
自定義實體可以在業務實體狀態修改時產生事件
// 為所有業務實體事件定義公用事件類
public class EntityEventArgs : EventArgs
{
// 定義事件成員
}
// 定義一個代理
public delegate void EntityEventHandler(Object source
// 定義自定義實體類
public class OrderEntity
{
// 定義業務實體狀態改變的
public event EntityEventHandler BeforeChange
// 專用字段
private int orderID;
private int customerID;
private DateTime orderDate;
private DateTime shippedDate;
private DataSet orderDetails;
// 公共屬性
public int OrderID
{
get { return orderID; }
set
{
BeforeChange(this
orderID = value;
AfterChange(this
}
}
public int CustomerID
{
get { return customerID; }
set
{
BeforeChange(this
customerID = value;
AfterChange(this
}
}
public DateTime OrderDate
{
get { return orderDate; }
set
{
BeforeChange(this
orderDate = value;
AfterChange(this
}
}
public DateTime ShippedDate
{
get { return shippedDate; }
set
{
BeforeChange(this
shippedDate = value;
AfterChange(this
}
}
// 必要時使用更多成員
}
關於上述代碼
EntityEvent 類提供有關業務實體相關事件的信息
OrderEntity 類定義了兩個名為 BeforeChange 和 AfterChange 的事件
OrderEntity 中的屬性設置器在業務實體狀態改變前產生一個 BeforeChange 事件
如何將業務實體組件序列化為 XML 格式
本節討論以下問題
使用 XmlSerializer 序列化自定義實體對象
XML Web Services 中對象的 XML 序列化
序列化自定義實體對象的默認 XML 格式
控制序列化自定義實體對象的 XML 格式
使用 XmlSerializer 序列化自定義實體對象
以下代碼示例顯示了如何使用 XmlSerializer 類將 OrderEntity 對象序列化為 XML 格式
using System
// 創建一個 XmlSerializer 對象
XmlSerializer serializer = new XmlSerializer(typeof(OrderEntity));
// 將 OrderEntity 對象序列化為名為
TextWriter writer = new StreamWriter(
serializer
writer
在 XML Web services 中序列化對象
以下代碼示例顯示了如何編寫使用自定義實體對象的 XML Web services
namespace MyWebService
{
[WebService(Namespace=
public class OrderWS : System
{
[WebMethod]
public OrderEntity GetOrder(int orderID)
{
// 創建 OrderDALC 對象
OrderDALC dalcOrder = new OrderDALC();
// 使用 dalcOrder 獲取指定訂單 ID 的 OrderEntity 對象
// 此代碼假設 OrderDALC 類有一個名為 GetOrder 的方法
// 該方法獲取一個訂單 ID 作為參數
// 其中包含該訂單的所有數據
OrderEntity order = dalcOrder
// 返回 OrderEntity 對象
return order;
}
[WebMethod]
public void UpdateOrder(OrderEntity order)
{
// 創建 OrderDALC 對象
OrderDALC dalcOrder = new OrderDALC();
// 使用 dalcOrder 將 OrderEntity 對象的數據保存到數據庫中
// 此代碼假設 OrderDALC 類有一個名為 UpdateOrder 的方法
// 該方法接收一個 OrderEntity 對象並將數據保存到數據庫中
dalcOrder
}
關於上述代碼
GetOrder 方法接收一個訂單 ID 作為參數
UpdateOrder 方法接收一個 OrderEntity 對象並將該對象的數據保存到數據庫中
如果客戶端應用程序調用 GetOrder 和 UpdateOrder 方法
序列化自定義實體對象的默認 XML 格式
以下 XML 文檔顯示了 OrderEntity 對象的默認 XML 序列化格式
<?xml version=
<OrderEntity xmlns:xsd=
xmlns:xsi=
<OrderID>
<CustomerID>VINET</CustomerID>
<OrderDate>
<OrderDetails>
<ShippedDate>
</OrderEntity>
上述文檔說明了 XML 序列化的默認規則
該 XML 文檔的根元素與類名稱 OrderEntity 相同
OrderEntity 對象中的每個公共屬性(及字段)都被序列化為具有相同名稱的元素
OrderEntity 類中的 OrderDetails 屬性是一個 DataSet
<OrderDetails>
<xs:schema id=
xmlns:xs=
xmlns:msdata=
<xs:element name=
UK
<xs:complexType>
<xs:choice maxOccurs=
<xs:element name=
<xs:complexType>
<xs:sequence>
<xs:element name=
<xs:element name=
<xs:element name=
/>
<xs:element name=
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgram xmlns:msdata=
xmlns:diffgr=
<NewDataSet>
<OrderDetails diffgr:id=
diffgr:hasChanges=
<OrderID>
<ProductID>
<UnitPrice>
<Quantity>
</OrderDetails>
<OrderDetails diffgr:id=
diffgr:hasChanges=
<OrderID>
<ProductID>
<UnitPrice>
<Quantity>
</OrderDetails>
<OrderDetails diffgr:id=
diffgr:hasChanges=
<OrderID>
<ProductID>
<UnitPrice>
<Quantity>
</OrderDetails>
</NewDataSet>
</diffgr:diffgram>
</OrderDetails>
關於 DataSet 的序列化
<xs:schema> 段描述了 DataSet 的結構
<xs:diffgram> 段包含該 DataSet 的數據
控制序列化自定義實體對象的 XML 格式
您可以在自定義實體類中使用
[XmlRoot(ElementName=
public class OrderEntity
{
[XmlAttribute(AttributeName=
public int OrderID {
[XmlAttribute(AttributeName=
public string CustomerID {
[XmlElement(ElementName=
public DateTime OrderDate {
public DataSet OrderDetails {
[XmlElement(ElementName=
public DateTime ShippedDate {
// 必要時使用更多成員
}
將 OrderEntity 對象序列化為 XML 後
<?xml version=
<Order ID=
CustID=
xmlns=
xmlns:xsd=
xmlns:xsi=
<Ordered>
<OrderDetails>
<Shipped>
</Order>
如何將業務實體組件序列化為 SOAP 格式
以下代碼示例顯示了如何使用 SoapFormatter 類將 OrderEntity 對象序列化為 SOAP 格式
using System
// 創建 SoapFormatter 對象
SoapFormatter formatter = new SoapFormatter();
// 將 OrderEntity 對象序列化為名為
FileStream stream = File
formatter
stream
要對自定義實體組件使用 SOAP 序列化
[Serializable]
public class OrderEntity
{
// 成員
如果要自定義序列化過程中生成的 SOAP 格式
using System
[Serializable]
public class OrderEntity : ISerializable
{
// 序列化函數
void ISerializable
ctxt)
{
// 向 SerializationInfo 對象中添加每個字段
info
// 必要時使用更多代碼
}
// 還原序列化構造函數
public OrderEntity(SerializationInfo info
{
// 從 SerializationInfo 對象中還原序列化出各個 OrderEntity 字段
orderID = (int)info
// 必要時使用更多代碼
}
// 其他成員
}
如何將業務實體組件序列化為二進制格式
以下代碼示例顯示了如何使用 BinaryFormatter 類將 OrderEntity 對象序列化為二進制格式
using System
// 創建 BinaryFormatter 對象
BinaryFormatter formatter = new BinaryFormatter();
// 將 OrderEntity 對象序列化為名為
FileStream stream = File
formatter
stream
要對自定義實體對象使用二進制序列化
From:http://tw.wingwit.com/Article/program/net/201311/12470.html