RSS

Sử dụng XML Serialization với các đối tượng tùy biến

06 May

Bạn cần sử dụng XML như một định dạng tuần tự hóa (serialization format). Tuy nhiên, bạn không muốn xử lý XML trực tiếp trong mã lệnh, mà muốn tương tác với dữ liệu bằng các đối tượng tùy biến.

Sử dụng lớp System.Xml.Serialization.XmlSerializer để chuyển dữ liệu từ đối tượng của bạn sang XML, và ngược lại. Bạn cũng có thể đánh dấu mã lệnh của lớp bằng các đặc tính để tùy biến biểu diễn XML của nó.

Lớp XmlSerializer cho phép chuyển các đối tượng thành dữ liệu XML, và ngược lại. Lớp này đủ thông minh để tạo đúng các mảng khi nó tìm thấy các phần tử lồng bên trong.

Các yêu cầu khi sử dụng XmlSerializer:
•XmlSerializer chỉ tuần tự hóa các thuộc tính và các biến công khai.

Các lớp cần tuần tự hóa phải chứa một phương thức khởi dựng mặc định không có đối số. XmlSerializer sẽ sử dụng phương thức khởi dựng này khi tạo đối tượng mới trong quá trình giải tuần tự hóa.

•Các thuộc tính của lớp phải là khả-đọc (readable) và khả-ghi (writable). Đó là vì XmlSerializer sử dụng hàm truy xuất thuộc tính get để lấy thông tin và hàm truy xuất thuộc tính set để phục hồi dữ liệu sau khi giải tuần tự hóa.

» Bạn cũng có thể lưu trữ các đối tượng theo định dạng dựa-trên-XML bằng cách sử dụng .NET Serialization và System.Runtime.Serialization.Formatters.Soap. SoapFormatter. Trong trường hợp này, bạn chỉ cần làm cho lớp của bạn trở thành khả-tuần-tự-hóa, không cần cung cấp phương thức khởi dựng mặc định hay bảo đảm tất cả các thuộc tính là khả ghi. Tuy nhiên, cách này không cho bạn quyền kiểm soát trên định dạng XML đã-được-tuần-tự-hóa.

Để sử dụng XML serialization, trước hết bạn phải đánh dấu các đối tượng dữ liệu với các đặc tính cho biết phép ánh xạ sang XML. Các đặc tính này thuộc không gian tên System.Xml.Serialization và bao gồm:

• XmlRoot —cho biết tên phần tử gốc của file XML. Theo mặc định, XmlSerializer sẽ sử dụng tên của lớp. Đặc tính này có thể được áp dụng khi khai báo lớp.
• XmlElement— cho biết tên phần tử dùng cho một thuộc tính hay biến công khai. Theo mặc định, XmlSerializer sẽ sử dụng tên của thuộc tính hay biến công khai.
• XmlAttribute —cho biết một thuộc tính hay biến công khai sẽ được tuần tự hóa thành một đặc tính (không phải phần tử), và chỉ định tên đặc tính.
• XmlEnum —cấu hình phần text sẽ được sử dụng khi tuần tự hóa các giá trị liệt kê. Nếu bạn không sử dụng XmlEnum, tên của hằng liệt kê sẽ được sử dụng.
• XmlIgnore— cho biết một thuộc tính hay biến công khai sẽ không được tuần tự hóa.

Ví dụ, xét danh mục sản phẩm đã được trình bày trong mục 5.1. Bạn có thể mô tả tài liệu XML này bằng các đối tượng ProductCatalog và Product như sau:

Code:
using System;
using System.Xml.Serialization;

[XmlRoot("productCatalog")]
public class ProductCatalog {

    [XmlElement("catalogName")]
    public string CatalogName;

    // Sử dụng kiểu dữ liệu ngày (bỏ qua phần giờ).
    [XmlElement(ElementName="expiryDate", DataType="date")]
    public DateTime ExpiryDate;

    // Cấu hình tên thẻ.
    [XmlArray("products")]
    [XmlArrayItem("product")]
    public Product[] Products;

    public ProductCatalog() {
        // Phương thức khởi dựng mặc định (dùng khi giải tuần tự hóa).
    }

    public ProductCatalog(string catalogName, DateTime expiryDate) {
        this.CatalogName = catalogName;
        this.ExpiryDate = expiryDate;
    }
}

public class Product {

    [XmlElement("productName")]
    public string ProductName;

    [XmlElement("productPrice")]
    public decimal ProductPrice;

    [XmlElement("inStock")]
    public bool InStock;

    [XmlAttributeAttribute(AttributeName="id", DataType="integer")]
    public string Id;

    public Product() {
        // Phương thức khởi dựng mặc định (dùng khi giải tuần tự hóa).
    }

    public Product(string productName, decimal productPrice) {
        this.ProductName = productName;
        this.ProductPrice = productPrice;
    }
}

Chú ý rằng, các lớp này sử dụng các đặc tính XML Serialization để đổi tên phần tử (sử dụng kiểu ký hiệu Pascal trong tên thành viên lớp, và kiểu ký hiệu lưng lạc đà trong tên thẻ XML), cho biết các kiểu dữ liệu không rõ ràng, và chỉ định các phần tử <product> sẽ được lồng bên trong <productCatalog> như thế nào.

Bằng cách sử dụng các lớp tùy biến này và đối tượng XmlSerializer, bạn có thể chuyển XML thành các đối tượng và ngược lại. Đoạn mã dưới đây tạo một đối tượng ProductCatalog mới, tuần tự hóa đối tượng thành tài liệu XML, giải tuần tự hóa tài liệu thành đối tượng, và rồi hiển thị tài liệu này:

Code:
using System;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

public class SerializeXml {

    private static void Main() {

        // Tạo danh mục sản phẩm.
        ProductCatalog catalog = new ProductCatalog("New Catalog",
          DateTime.Now.AddYears(1));
        Product[] products = new Product[2];
        products[0] = new Product("Product 1", 42.99m);
        products[1] = new Product("Product 2", 202.99m);
        catalog.Products = products;

        // Tuần tự hóa danh mục ra file.
        XmlSerializer serializer =
          new XmlSerializer(typeof(ProductCatalog));
        FileStream fs =
          new FileStream("ProductCatalog.xml", FileMode.Create);
        serializer.Serialize(fs, catalog);
        fs.Close();

        catalog = null;

        // Giải tuần tự hóa danh mục từ file.
        fs = new FileStream("ProductCatalog.xml", FileMode.Open);
        catalog = (ProductCatalog)serializer.Deserialize(fs);

        // Tuần tự hóa danh mục ra cửa sổ Console.
        serializer.Serialize(Console.Out, catalog);
        Console.ReadLine();
    }
}

Trích từ “Các giải pháp lập trình C#”

 
Leave a comment

Posted by on 06/05/2008 in XML

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: