| XMLSerializer
.Net Framework cung cấp các lớp trong namespace
System.XML.Serialization cho công việc chuyển đổi này, trong đó lớp
XMLSerializer có vai trò quan trọng. Mỗi thể hiện (instance) của lớp
này được tạo ra cho mỗi đối tượng cần chuyển. Nó chứa các thông số ánh
xạ để chuyển thuận hoặc chuyển ngược giữa đối tượng và dữ liệu XML. Lớp
XMLSerializer có 2 phương thức quan trọng:
public void Serialize(Stream, object);
public object Deserialize(Stream);
Chúng ta có thể sử dụng lớp XMLSerializer như sau:
XMLSerializer serializer = new XMLSerializer(typeof(OrderedItem));
OrderedItem order = new OrderedItem();
...
//chuyển thuận
XMLWriter writer = new XMLTextWriter(fs, new UTF8Encoding());
serializer.Serialize(writer, order);
//chuyển ngược
fs = new FileStream(ten_file, FileMode.Open);
XMLReader reader = new XMLTextReader(fs);
i = (OrderedItem) serializer.Deserialize(reader);
Mặc định XMLSerializer sẽ chuyển tất cả các trường (field) public,
các thuộc tính (Property) read/write và các giá trị khác null trở thành
element với tagname là tên thuộc tính. Tất cả các element này được đặt
trong lớp element cha, với tagname là tên lớp. Ví dụ lớp Person được
trình bày như dưới đây:
public class Person
{
public string Name = "Ten";
public int Age = 33;
private string Address = "HCM";
public string Sex = null;
public Person() { }
}
sẽ được chuyển thành dữ liệu XML:
<?XML version="1.0"?>
<Person XMLns:xsd="http://www.w3.org/2001/XMLSchema" XMLns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Name>Ten</Name>
<Age>33</Age>
</Person>
Address không được chuyển vì nó là thuộc tính private, và Sex cũng không có trong dữ liệu XML vì có giá trị null.
XMLSerializer có đầy đủ các chức năng để thực hiện việc chuyển các đối
tượng sang dữ liệu XML và ngược lại. Sau đây, chúng ta sẽ khảo sát các
khai báo cần thiết để chuyển các thuộc tính của một đối tượng sang dữ
liệu XML.
Chuyển các đối tượng
Nếu bạn muốn chuyển lớp Person thành element với tagname là Employee
thay vì Person, bạn định nghĩa nó thông qua thuộc tính XMLRoot:
[XMLRoot("Employee")]
public class Person
{...}
Nếu muốn chuyển thuộc tính Name thành element có TagName là PersonName, bạn định nghĩa nó thông qua XMLElement:
[XMLElement("PersonName")]
public string Name = "Ten";
// tương tự thuộc tính Age thành element PersonAge
[XMLAttribute("PersonAge")]
public int Age = 33;
Nếu không muốn chuyển một thuộc tính dạng public sang dữ liệu XML, ta dùng XMLIgnore:
[XMLIgnore()]
public string Sex = "Nam";
Nếu các thuộc tính có kiểu là một lớp, các thành phần public của lớp
được chuyển như đã định nghĩa, và element tương ứng của lớp sẽ có
tagname được định nghĩa trong XMLElement.
Lớp Person được chỉ định bởi:
[XMLElement("Supervisor")]
public Person Supervisor = null;
sẽ được chuyển thành dữ liệu XML như sau:
<Supervisor>
<PersonName>Ten</PersonName>
...
</Supervisor>
XMLIgnore có thể giúp chúng ta chuyển hoặc không chuyển sang XML một trường hoặc thuộc tính tùy thuộc vào giá trị của nó.
Để thực hiện việc này, chúng ta thêm một thuộc tính mới vào lớp với tên
trùng với thuộc tính cộng thêm từ Specified sau đó. Ví dụ, chúng ta
không muốn chuyển thuộc tính Age của lớp Person, chúng ta thực hiện như
sau:
[XMLAttribute("PersonAge")]
public int Age = 33;
[XMLIgnore()]
public bool AgeSpecified = false;
Nếu AgeSpecified có giá trị là true, Age sẽ được chuyển. Khi làm
việc trên XMLSerializer tôi rất thích đặc điểm này vì nó giúp chúng ta
bật tắt việc chuyển theo giá trị.
Chuyển mảng, danh sách,...
Ở phần trên chúng ta đã lần lượt xem xét các khai báo XML để chuyển các
đối tượng đơn, trong phần này chúng ta sẽ khảo sát các khai báo cho các
đối tượng tập hợp (Collection).
Tương tự như ở phần trên, chúng ta cũng phải chuyển các đối tượng ở dạng mảng vào thành một element.
[XMLArray("Agents")]
[XMLArrayItem("Agent", typeof(Person))]
public ArrayList Agents = null;
Kết quả khi chuyển sẽ là:
<Employee>
<PersonName>Ten</PersonName>
<Agents>
<Agent>
<PersonName>Ten</PersonName>
</Agent>
</Agents>
</Employee>
Ở ví dụ trên, các phần tử có kiểu là Person, đều được chuyển thành
các element Agent. Nếu muốn thêm các kiểu khác vào danh sách, chúng ta
thêm các khai báo XMLArayItem tương ứng tiếp sau khai báo cho Person.
Nếu muốn tất cả các phần tử trong danh sách đều có tagname giống nhau,
chúng ta cần khai báo XMLArrayItem với một tham số là ElementName (bỏ
qua kiểu dữ liệu).
Kết quả chúng ta có tập tin dữ liệu XML như sau:
<Employee >
<PersonName>Name</PersonName>
<Agents>
<Agent xsi:type="Person">
<PersonName>Ten</PersonName>
</Agent>
<Agent xsi:type="Person1" />
</Agents>
</Employee>
Thuộc tính xsi:type được thêm vào cho các element của ArrayList để giúp việc chuyển ngược dữ liệu XML này sang đối tượng.
Trên đây tôi đã trình bày sơ lược về XMLSerializer. Nếu làm việc với
đối tượng này, bạn sẽ phát hiện nhiều điều đặc biệt hơn nữa và hy vọng
bạn sẽ thích thú. .NET Framework cũng cho phép bạn lấy các khai báo cho
các lớp để chuyển thông qua viết lệnh. Nếu bạn đã từng sử dụng
namespace System.Reflection trong .NET, hay reflection trong Java, chắc
là sẽ cảm thấy thích thú với đặc điểm này.
XMLSerializer có một hạn chế khi dự án có số lượng lớp quá lớn. Khi đó,
việc tạo thể hiện cho hàng trăm lớp có khả năng làm chậm hệ thống. Tuy
XMLSerializer cho phép bạn khai báo để nó chỉ tìm kiếm các đối tượng
trong một số lớp cho trước, nhưng nó khá chậm. Theo kinh nghiệm của tôi
khi làm việc trên dự án lớn, bạn chỉ nên tạo một thể hiện của
XMLSerializer cho mỗi lớp và dùng nó xuyên suốt toàn bộ ứng dụng thì
vấn đề tốc độ thực thi sẽ được giải quyết. Theo
.NET Việt Nam Số lượt đọc:
307
-
Cập nhật lần cuối:
02/04/2008 12:17:59 AM | So sánh syntax c# and vb.net 23/06/2008 04:12' PM Sự khác biệt giữa VB.NET và C# được thể hiện ở ba phần chính: cú pháp,
các nguyên lý hướng đối tượng, và môi trường phát triển tích hợp Visual
Studio .NET. Sự khác biệt về cú pháp liên quan đến các câu lệnh và các
yếu tố ngôn ngữ. Sự khác biệt về hướng đối tượng thì khó thấy hơn, liên
quan đến bản hiện thực và tính năng giữa hai ngôn ngữ. Sự khác biệt về
môi trường phát triển tích hợp bao gồm những thiết lập biên dịch (là
những đặc tính được thiết lập thông qua IDE, có tác dụng khác nhau tùy
vào ngôn ngữ). Cũng có sự khác biệt thứ tư liên quan đến các tính năng
ngôn ngữ có trong ngôn ngữ này nhưng không có trong ngôn ngữ kia.
Sử dụng Singleton Pattern trong C#18/06/2008 02:10' AMMẫu thiết kế Singletonlà
một trong những mẫu thông dụng và được sử dụng rộng rãi nhất trong kĩ
thuật lập trình. Về nguyên tắc, một Singleton là một lớp chỉ cho phép
một đối tượng tương ứng được tạo, và tất nhiên nó cũng phải có một
public member để những đối tượng khác có thể truy xuất instance Singletonnày Lợi ích của .NET Framework 06/06/2008 06:58' PM Mọi chuyện ... 'trên trời dưới đất' mà ta muốn thực hiện trên nền
Windows, tỷ như data access, windowing, nối mạng hay ngay cả mọi công
dụng đa dạng của Win32 API (Application Programming Interface) đều có
thể vận dụng dễ dàng qua kiểu mẫu đối tượng (objects) rất đơn giản
(simple object model). Làm việc với các file Tài Nguyên Resource 06/06/2008 01:22' PM Trong
một ứng dụng, có rất nhiều tài nguyên như: các file hình ảnh, âm nhạc,
văn bản... Vậy bạn có biết Làm thế nào để lưu tất cả những tài nguyên
đó vào cùng một file không? Và sẽ làm như thế nào? Bài viết này, mình
sẽ giới thiệu cho các bạn cách làm việc với các file tài nguyên
Resource: lưu trữ và đọc các thông tin đó.
Kiểu dữ liệu Hashtable 10/05/2008 01:47' AM
Bài viết giúp bạn hiểu về kiểu dữ liệu HastTable trong nền tảng .NET (ngôn ngữ C#). Tạo các ứng dụng .Net trên Linux và Mac OS X 25/04/2008 03:30' PM Bài
báo này được trích dẫn từ cuốn Windows Developer Power Tools của James
Avery và Jim Holmes, theo giấy phép của O’Reilly Media Inc. Visual Studio 2008 - New Features21/04/2008 12:46' AMVisual Studio 2008 code name "Orcas" Beta 2
has just hit the road and, since it is Beta 2, this means Visual Studio
2008 is feature complete and is ready for RTM. Below, we would find a
brief introduction of some of the new features introduced with VS 2008
and .NET 3.5 Beta 2. Bài đã đăng: Khởi tạo ứng dụng Linux đầu tiên với Visual Studio .NET 2003 IDE 05/06/2005 08:12' PM Bài viết "Create your first Linux application with the Visual Studio .NET IDE in 10 minutes" của hãng Mainsoft giới thiệu tổng quan chung về công nghệ Grasshopper giúp cho các ứng dụng .NET có thể chạy trên Unix/Linux. .NET Framework - Tâm điểm của Nền tảng .NET (phần II) 02/04/2005 02:28' PM Như chúng ta đã biết, phần cốt lõi nhất trong Nền tảng .NET là .NET Framework. Đây là thành phần quan trọng nhất cho các nhà thiết kế muốn xây dựng những giải pháp cụ thể cho các ứng dụng và các dịch vụ Web XML. Trong bài viết phần I, chúng tôi đã giới thiệu với bạn những đặc trưng, những ưu điểm của .NET Framework trong việc phát triển các ứng dụng và các dịch vụ Web bên cạnh công nghệ dựa trên nền tảng Java mà chúng ta đã quen biết. Phần hai này sẽ cho giới thiệu chi tiết hơn về cơ sở hạ tầng .NET Framework. .NET Framework - Tâm điểm của Nền tảng .NET (phần I) 02/04/2005 01:25' PM Như chúng ta đã biết, phần cốt lõi nhất trong Nền tảng .NET là .NET Framework. Đây là thành phần quan trọng nhất cho các nhà thiết kế muốn xây dựng những giải pháp cụ thể cho các ứng dụng và các dịch vụ Web XML. Phần đầu bài báo nêu những đặc trưng, những ưu điểm của .NET Framework trong việc phát triển các ứng dụng và các dịch vụ Web bên cạnh công nghệ dựa trên nền tảng Java mà chúng ta đã quen biết. Phần hai nghiên cứu chi tiết cơ sở hạ tầng .NET Framework Nền tảng .NET (.NET Framework)02/04/2005 12:01' PM .NET là nền tảng của Microsoft cho các dịch vụ Web XML, là thế hệ phần mềm kế tiếp kết nối thế giới thông tin, các thiết bị và tất cả mọi người trong một thể thống nhất. Nền tảng .NET cho phép tạo ra và sử dụng các ứng dụng, các quá trình và các Website dựa trên XML như những dịch vụ chia xẻ, kết nối thông tin và hoạt động cùng nhau, trên bất cứ nền tảng hay thiết bị thông minh nào... Tổng quan về Microsoft .NET02/04/2005 11:23' AM Sự khởi xướng ý tưởng .NET là một bước đột phá mới của Microsoft. Nó bao hàm nhiều quan niệm hiện hữu và những triết lý. Microsoft đưa ra công nghệ mà nó cho phép ý tưởng .NET trở thành hiện thực. Bài báo này sẽ cung cấp cho bạn một cái nhìn tổng thể về .NET, nó rất có ý nghĩa cho thế giới CNTT và nhất là cho Internet. |