Có lẽ có nhiều người đã quen với các file Xml như dùng để cấu hình…. Trong bài viết này, Minh sẽ giới thiệu khái niệm Xml Serialize trong .NET từ cơ bản nhất và đến các yêu cầu phức tạp trong các bài viết tiếp theo.
Khái niệm Xml Serialize nói nôm na là chuyển các Object thành dữ liệu có cấu trúc dạng Xml. DeSerialize, như tên của nó, mang ý nghĩa ngược lại, chuyển dữ liệu từ dạng Xml thành các object một cách đơn giản và nhanh chóng.
Ok, let’s begin.
Mình cần viết 1 control là 1 menu, danh sách các menu được đọc từ file xml gọi là MainMenu.config. Sở dĩ Minh đặt là .config là để đảm bảo rằng nội dung của file không được truy xuất bằng cách gọi thông qua http web thông thường. (Ví dụ kiểu: http://www.abc.com/MainMenu.config).
Thử tưởng tượng 1 menu sẽ bao gồm những gì ? Link là chắc chắn phải có rồi, tiếp nữa là chữ để hiển thị trên menu, rồi chữ tooltip khi user đưa chuột vào menu. Vậy chắc tạm ổn, bắt đầu xây dựng cấu trúc Menu XML.
Vậy là ta đã file xml cơ bản thể hiện cấu trúc của các menu dưới dạng xml. Ở đây, bạn để ý rằng chúng ta có 1 thẻ Root là Menus (có s), tiếp theo là 1 thẻ gần như thẻ Root là MenuList, cuối cùng, nhìn vào có thể thấy rằng thẻ Menu là đại diện cho một Menu item.
Tại sao lại vừa có thẻ Menus và MenuList ? Điều này rất quan trọng, và mình sẽ giải thích sau.
Tiếp theo, mình viết các class tương ứng.
Như bạn thấy ở trên, mình có thẻ Menu, và thẻ Menu này tương ứng với một Class. Mình sẽ khai báo class Menu như sau:
Để ý rằng, tên class phải trùng tên của Tag Menu, các thuộc tính bên trong, phải có tên trùng với các tag bên trong của thẻ Menu. Các thuộc tính phải là public. Ở đây, tất cả kiểu dữ liệu đều là string.
Sau khi bạn khai báo xong class Menu, giờ tới phiên mình khai báo Menus bên ngoài chứa 1 mảng các Menu như trong file XML.
Để ý tên class, mình phải khai báo giống như thẻ Tag Menus, và tương tự Class Menu, mình xem như thẻ MenuList là một thuộc tính của class Menus, tương tự Name là một thuộc tính của Menu. Điểm khác ở đây là mình khai báo kiểu dữ liệu của MenuList là mảng các Menu. Đây cũng là lý do để mình khai báo thêm 1 tag MenuList mà chức năng tương tự như Menus. Nhưng nó thật sự khác, mình sẽ thảo luận trong các bài viết kế tiếp.
Đến đây, gần như bạn đã hoàn thành phần XmlSerialize rồi đó. Khá đơn giản phải không nào?
Cuối cùng, thực hiện lệnh gọi Serialize.
Trong đoạn code trên, có 3 chỗ bạn cần chú ý:
- khởi tạo đối tượng xs kiểu XmlSerializer có kiểu là kiểu Menus, tương ứng cho kiểu bao trùm cho toàn bộ file Xml.
- File Xml sau khi deserialize xong thì phải Close lại, nếu không chương trình khác sẽ không đọc được vì bị ASP .NET Process chiếm quyền đọc file.
- Ở đây, chúng ta casting theo kiểu dùng từ khóa as, ở một số trang web, người ta thường dùng kiểu
Menus result = (Menus)xs.Deserialize(fs);
Nhưng nếu sử dụng kiểu casting này, trường hợp Deserialize ra mà không đúng kiểu Menus hoặc null thì sẽ sinh ra exception. Do đó, cách casting ở đây sẽ loại bỏ trường hợp đó. Nếu như cast ko được, thì result sẽ có giá trị null.
Cuối cùng, để xem thành quả, chúng ta bind nó vào 1 repeater để show lên web thử xem nhé.
ASPX
Code:
Rồi, giờ thì nhấn F5, chạy thôi.
Chỉ qua vài bước đơn giản, chúng ta đã có thể “chuyển” nội dung từ 1 file Xml thành 1 dạng các object mà ko cần phải thao tác nhiều.
Ứng dụng:
* Làm các RSS reader đơn giản một cách dễ dàng bằng cách khai báo:
- Class item với các thuộc tính: link, title, pubdate, description
- Class rss với thuộc tính dạng item[] channel;
- Đọc file xml từ các rss feed. Thử đọc từ trang Tuổi trẻ và show lên trang web.
* Bài viết tiếp theo: Làm việc với các cấu trúc phức tạp hơn: bỏ qua các tag, truy xuất các thuộc tính, đặt namespace, đọc từ root tag…
em hỏng hỉu cái này, anh làm pascal đi^^ đọc hỏng hỉu j hết trọy^^
every good, thanks N.H.A.T
Good, Thanks so much!
hay lắm, phát huy nhé bạn..
Hi just wanted to drop you a note to tell you that I found your website to be extremely helpful in my research. The points that I have read here are really in line with what I was thinking as well. Great Site, and I would like to thank you for the effort you put into bringing this info to your readers.