Friday, May 17, 2013

Object and XML with XStream


ABSTRACT



GIỚI THIỆU

Khi đã quen thuộc với các trường (thuộc tính) của đối tượng cũng như các thẻ trong định dạng XML (eXtensible Markup Language), một câu hỏi đặt ra cho người lập trình là cấu trúc của đối tượng có tương tự cấu trúc của XML hay không, và nếu tương tự thì cách chuyển đổi giữa chúng như thế nào. Đối tượng và XML có những điểm mạnh và yếu riêng, nhiệm vụ của lập trình viên là tìm thấy được những điểm mạnh và liên kết chúng lại với nhau. Một chiếc cầu nối tốt giữa đối tượng và XML là một chiếc cầu tận dụng được tối đa khả năng lưu trữ đối tượng xuống hệ thống tập tin cũng như phát huy tốt nhất khả năng lưu trữ dữ liệu của tập tin XML. Đối tượng có thể được lưu giữ lại một cách dễ dàng thành định dạng XML, và từ XML ta có thể lấy lại đối tượng đó bất cứ lúc nào.

Bài viết nhằm giới thiệu XStream, một thư viện xây dựng sẳn viết bằng ngôn ngữ Java, để chuyển đổi đối tượng sang định dạng XML và ngược lại. Hơn nữa, XStream còn được dùng minh họa việc đọc và ghi dữ liệu hướng đối tượng có sử dụng tiếng Việt xuống hệ thống tập tin. Bài viết còn chú trọng đến việc tạo chuỗi tiếng Việt trong JBuilder IDE và Eclipse IDE.

SỬ DỤNG XSTREAM CHUYỂN ĐỔI CHUỖI CÓ ĐỊNH DẠNG XML THÀNH ĐỐI TƯỢNG VÀ NGƯỢC LẠI

Công việc đầu tiên nên làm sau khi cài đặt XStream vào IDE (Integrated Development Environment) là kiểm thử xem nó có hoạt động tốt hay không. Ta tạo class testXStream có nội dung như sau:

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import java.util.List;

public class testXStream {
public static void main(String[] args) {
String xml =
"" +
"String1" +
"String2" +
"String3" +
"
";

// khởi tạo đối tượng xStream tuân theo quy định của thư viện
// XStream
XStream xStream = new XStream(new DomDriver());

// chuyển đổi kiểu trả về thành List
List result = (List)xStream.fromXML(xml);

System.out.println(result);
}
}

Trong phương thức main, ta khởi tạo một chuỗi có dạng XML, chuỗi này chứa thẻ gốc (root) và bao gồm ba thẻ . Sau đó, ta tiếp tục khởi tạo một đối tượng xStream nhằm tiến hành việc chuyển đổi một chuỗi ở định dạng XML sang đối tượng. Mục đích của việc đặt tên (liststring) cho các thẻ ở chuỗi xml là tận dụng ưu điểm của thư viện XStream. Mỗi khi duyệt qua một thẻ có nội dung tương ứng với một đối tượng có sẳn trong Java, XStream lập tức chuyển đổi nội dung của thẻ này thành nội dung của đối tượng tương ứng. Như ta thấy ở đoạn mã trên, ba thẻ được chứa trong một thẻ , có nghĩa là sau khi dùng XStream chuyển đổi, ta sẽ có được một List bao gồm ba đối tượng String. Đối tượng result, là một List, chứa kết quả của việc chuyển đổi. Công việc cuối cùng mà đoạn mã trên phải làm là in đối tượng result ra màn hình:

[String1, String2, String3]

Sau khi thực hiện tốt công việc kiểm thử XStream, bước tiếp theo mà ta phải làm là chuyển đổi một chuỗi dạng XML, các thẻ của chuỗi này hoàn toàn không tương ứng với các đối tượng có sẳn trong Java, sang đối tượng. Công việc phải làm lúc này là cho XStream biết rõ thẻ và đối tượng mà XStream sẽ phân tích. Ta xây dựng một đối tượng Person bao gồm các thuộc tính tên (fullName), địa chỉ nhà (homeAddress) và số điện thoại (phoneNumber):

public class Person {
private String fullName;
private String homeAddress;
private int phoneNumber;

public Person(String fullName, String homeAddress, int phoneNumber) {
this.fullName = fullName;
this.homeAddress = homeAddress;
this.phoneNumber = phoneNumber;
}

public String toString() {
return fullName + " - " + homeAddress + " - " + phoneNumber;
}
}

Class testXStream_person tương ứng sẽ là:

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class testXStream_person {
public static void main(String[] args) {
String xml =
"" +
"Nguyen Tuong Thuy" +
"19/36D Tran Binh Trong, P5, Q Binh Thanh" +
"8431459" +
"
";
XStream xStream = new XStream(new DomDriver());
xStream.alias("person", Person.class);

// chuyển đổi kiểu trả về thành Person
Person result = (Person)xStream.fromXML(xml);

System.out.println(result);
}
}

Với chuỗi xml trên, XStream phải nhận biết được từng thẻ tương ứng với đối tượng nào để có thể tiến hành chuyển đổi. Mặc định, các thẻ , , , không nằm trong phạm vi nhận biết của XStream, do đó ta phải khai báo cho XStream biết đâu là chuỗi mà ta cần lấy đối tượng tương ứng. Phương thức alias quy định đối tượng tương ứng với thẻ mà XStream gặp trong quá trình phân tích chuỗi. Như vậy, thẻ sẽ tương ứng với đối tượng Person. Căn cứ vào thông số trong phương thức này, XStream tiếp tục phân tích các thẻ con của dựa trên các thuộc tính (trường) tương ứng có trong class Person. Lưu ý là tên của các thuộc tính trong đối tượng Person phải giống với tên của các thẻ con nằm trong và kiểu của các trường cũng tương ứng với dữ liệu ở các thẻ con. Kết quả của đoạn chương trình trên sẽ là:

Nguyen Tuong Thuy - 19/36D Tran Binh Trong, P5, Q Binh Thanh - 8431459

Sau khi đã có được đối tượng, công việc chuyển đổi từ đối tượng sang định dạng XML vô cùng đơn giản bằng việc gọi phương thức toXML của XStream:

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class testXStream_person {
public static void main(String[] args) {
String xml =
"" +
"Nguyen Tuong Thuy" +
"19/36D Tran Binh Trong, P5, Q Binh Thanh" +
"8431459" +
"
";
XStream xStream = new XStream(new DomDriver());
xStream.alias("person", Person.class);

// chuyển đổi kiểu trả về thành Person
Person result = (Person)xStream.fromXML(xml);

String xmlResult = xStream.toXML(result);
System.out.println(xmlResult); // kết quả chính bằng chuỗi xml
}
}

Mặc dù chỉ mới sơ lược qua một vài phương thức có trong thư viện XStream, nhưng ta đã có thể tận dụng được tốt những tính năng có sẳn của thư viện, giúp cho việc thao tác với đối tượng và dữ liệu dễ dàng hơn. Ưu điểm nổi bật của định dạng XML là cho phép người sử dụng tự do đặt tên thẻ, cũng như số lượng thẻ tùy ý miễn là tuân theo cấu trúc định sẳn của XML. Chúng ta đã tận dụng tốt ưu điểm này.

ĐỌC TẬP TIN XML CÓ SỬ DỤNG TIẾNG VIỆT ĐỂ CHUYỂN ĐỔI THÀNH ĐỐI TƯỢNG

Nâng cao hơn so với phần trên, chuỗi xml ở phần này sẽ được thay thế bằng một phương thức đọc tập tin. Tập tin person.xml được đọc có nội dung tương tự chuỗi xml ở phần trên:

Nguyen Tuong Thuy
19/36D Tran Binh Trong, P5, Q Binh Thanh
8431459

Ta tạo một class mới với tên XMLFileToObject để thuận tiện cho việc quan sát mã chương trình. Kết quả in ra màn hình của phương thức main cũng tương tự như kết quả có ở phần trên:

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import java.io.*;

public class XMLFileToObject {
public static void main(String[] args) throws FileNotFoundException, IOException {
String xmlString = readXMLFromFile("person.xml");

XStream xStream = new XStream(new DomDriver());
xStream.alias("person", Person.class);
Person person = (Person)xStream.fromXML(xmlString);

System.out.println(person);
}

// phương thức đọc nội dung của một tập tin
// kết quả trả về là một chuỗi đại diện cho nội dung của tập tin đó
public static String readXMLFromFile(String fileName) throws FileNotFoundException, IOException {
BufferedReader bufferedReader = new BufferedReader(new FileReader(fileName));
String result = "";
while (bufferReader.ready())
result += bufferReader.readLine();
bufferReader.close();
return result;
}
}

Đến đây, công việc đọc một tập tin XML có sử dụng tiếng Việt thật dễ dàng bằng cách thay giá trị khởi tạo của đối tượng bufferedReader bằng một đối tượng hỗ trợ tiếng Việt. Bộ mã Unicode tiếng Việt sử dụng ở đây là UTF-8 (Unicode Transformation Format 8 bits):

public class XMLFileToObject {
public static void main(String[] args) throws FileNotFoundException, IOException {
...
}

// phương thức đọc nội dung của một tập tin có tiếng Việt
// kết quả trả về là một chuỗi đại diện cho nội dung của tập tin đó
public static String readXMLFromFile(String fileName) throws FileNotFoundException, IOException {
// BufferedReader bufferReader = new BufferedReader(new FileReader(fileName));
BufferedReader bufferReader = new BufferedReader(
new InputStreamReader(
new FileInputStream(fileName),
"UTF8"));
String result = "";
...
}
}

Tiếp tục, để có thể kiểm thử việc đọc tập tin tiếng Việt cũng như việc lưu giữ thông tin có tiếng Việt vào đối tượng, trước hết ta phải thay đổi nội dung tập tin person.xml như sau:

Nguyễn Tường Thụy
19/36D Trần Bình Trọng, P5, Q Bình Thạnh
8431459

Bước kế tiếp là sử dụng System.out.println in đối tượng person ra màn hình để có thể quan sát dễ dàng. Tuy nhiên, do cửa sổ hiển thị kết quả của IDE không thể đưa ra thông tin tiếng Việt chính xác nên ta phải thông qua một bước trung gian. Sau khi đưa nội dung tập tin XML vào đối tượng, bước trung gian đưa đối tượng này ngược trở lại vào một tập tin XML khác. Nếu nội dung tập tin XML mới này chứa các chuỗi tiếng Việt chính xác và đầy đủ tương tự tập tin XML ban đầu thì công việc đọc tập tin XML tiếng Việt đã thành công. Hơn thế, công đoạn kiểm thử việc ghi một đối tượng có dữ liệu tiếng Việt cũng đã hoàn tất.

Class XMLFileToObject lúc này có nội dung như bên dưới. Kết quả của đoạn chương trình là tạo ra một tập tin person2.xml có nội dung tương tự person.xml:

public class XMLFileToObject {
public static void main(String[] args) throws FileNotFoundException, IOException {
String xmlString = readXMLFromFile("person.xml");

XStream xStream = new XStream(new DomDriver());
xStream.alias("person", Person.class);
Person person = (Person)xStream.fromXML(xmlString);

writeXMLToFile(xStream.toXML(person), "person2.xml");
}

// phương thức đọc nội dung của một tập tin có tiếng Việt
// kết quả trả về là một chuỗi đại diện cho nội dung của tập tin đó
public static String readXMLFromFile(String fileName) throws FileNotFoundException, IOException {
BufferedReader bufferReader = new BufferedReader(
new InputStreamReader(
new FileInputStream(fileName),
"UTF8"));
String result = "";
while (bufferReader.ready())
result += bufferReader.readLine();
bufferReader.close();
return result;
}

// phương thức ghi một chuỗi có tiếng Việt xmlString vào tập tin fileName
public static void writeXMLToFile(String xmlString, String fileName) throws IOException {
BufferedWriter bufferedWriter = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(fileName),
"UTF8"));
bufferedWriter.write(xmlString);
bufferedWriter.close();
}
}

GÕ TIẾNG VIỆT VỚI ECLIPSE 3.0

Eclipse 3.0 cung cấp khả năng gõ tiếng Việt ngay trong trình soạn thảo. Ở chế độ mặt định, Eclipse vẫn cho phép gõ chuỗi tiếng Việt trong trình soạn thảo, nhưng khi thực hiện việc ghi chuỗi này xuống tập tin thì kết quả không chính xác. Do đó, để Eclipse có thể hoàn toàn hỗ trợ việc gõ tiếng Việt mà không cần dùng bất kỳ một công cụ hay một phương thức nào khác (như phương thức VIQRToUnicodeHex hỗ trợ trong JBuilderX mà bài viết sẽ đề cập bên dưới), ta có thể thực hiện các bước đơn giản sau:

  1. Vẫn tạo project, package, class như bình thường. Giả sử như ta sử dụng lại class XMLFileToObject ở phần trên. Class này có phương thức readXMLFromFile (đọc nội dung một tập tin XML có tiếng Việt), phương thức writeXMLToFile (ghi một chuỗi có tiếng Việt ra tập tin XML) và một phương thức main cho phép kiểm thử.

  1. Cấu hình Eclipse để hỗ trợ mã tiếng Việt UTF-8 ở mọi project:

  • Vào menu Window, chọn Preferences.


  • Ở cửa sổ Preferences, chọn WorkbenchEditors ở khung bên trái. Sau đó, tại combo box OtherText file encoding, chọn UTF-8. Kích OK.


  • Mỗi khi tạo một class mới, ta đều có thể gõ được tiếng Việt và ghi xuống tập tin dễ dàng.

      1. Thay đổi mã chương trình ở phương thức main để kiểm thử:
Để đơn giản, ta chỉ thực hiện việc ghi một chuỗi dạng XML có tiếng Việt xuống tập tin mà không cần thông qua XStream như đã làm ở trên. Do đó đồng thời ta cũng có thể lược bỏ phương thức readXMLFromFile (vì chỉ thực hiện việc ghi tập tin). Toàn bộ mã nguồn của class XMLFileToObject như sau:

import java.io.*;

public class XMLFileToObject {
public static void main(String[] args) throws IOException {
String xml =
"" + "\n" +
"Nguyễn Tường Thụy" + "\n" +
"19/36D Trần Bình Trọng, P5, Q Bình Thạnh" + "\n" +
"8431459" + "\n" +
"
";

writeXMLToFile(xml, "person.xml");
}
public static void writeXMLToFile(String xmlString, String fileName) throws IOException {
BufferedWriter bufferedWriter = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(fileName),
"UTF8"));
bufferedWriter.write(xmlString);
bufferedWriter.close();
}
}

Vậy là sau khi chạy đoạn chương trình trên, tập tin person.xml được phát sinh. Tập tin này có nội dung là chuỗi xml với đầy đủ các ký tự tiếng Việt.

HỖ TRỢ TẠO CHUỖI TIẾNG VIỆT TRONG JBUILDER IDE

Ngoài cách tạo tiếng Việt như ở Eclipse, ta có thể tạo được các ký tự tiếng Việt trong IDE bằng cách dùng mã Unicode Hex tương ứng. Ví dụ, ký tự có thể được đại diện bằng mã \u1EAF, và chuỗi "thng" sẽ tương ứng với "th\u1EAFng". Vậy là mỗi khi muốn tạo một ký tự tiếng Việt nào người lập trình cũng phải gõ mã đại diện của nó, bao nhiêu ký tự tiếng Việt khác nhau là bấy nhiêu mã Unicode người lập trình phải nhớ.

Bài viết này cung cấp một phương thức hỗ trợ việc gõ tiếng Việt dễ dàng hơn. Khi gõ một chuỗi ký tự tiếng Việt, thay vì gõ bình thường thì người lập trình cần gõ theo qui ước của VIQR, rồi gọi phương thức VIQRToUnicodeHex để hỗ trợ việc chuyển đổi sang mã Unicode.

VIQR đơn thuần chỉ là bảng mã dùng các ký tự gần giống các dấu của ký tự để biểu diễn các dấu thật sự. Ví dụ như ta có ký tự , ký tự này thể hiện ở VIQR sẽ là a('; ký tự ô sẽ là o^; ký tự èe`...

Phương thức hỗ trợ VIQRToUnicodeHex trong class UnicodeConverter hoạt động dựa theo nguyên tắc tìm kiếm trên một bảng băm (hash table) có lưu giữ từng cặp key-value tương ứng với mã VIQR-mã Unicode Hex. Phương thức VIQRToUnicodeHex sử dụng một đối tượng kiểu HashMap để hiện thực bảng băm. HashMap chứa tất cả các ký tự tiếng Việt có thể có cùng với mã Unicode Hex tương ứng. Mỗi khi yêu cầu lấy mã Unicode Hex của ký tự VIQR, key của HashMap sẽ là ký tự VIQR và value Unicode Hex sẽ là giá trị trả về. Như vậy việc chuyển đổi VIQR thành Unicode Hex đơn giản chỉ là việc tìm kiếm. Mã nguồn của phương thức VIQRToUnicodeHex như sau:

public static String VIQRToUnicodeHex(String viqr) {
Map hashMap = new HashMap();
hashMap.put("a'","\u00E1"); hashMap.put("a`","\u00E0");
hashMap.put("a?","\u1EA3"); hashMap.put("a~","\u00E3");
hashMap.put("a.","\u1EA1"); hashMap.put("a(","\u0103");
hashMap.put("a('","\u1EAF"); hashMap.put("a(`","\u1EB1");
hashMap.put("a(?","\u1EB3"); hashMap.put("a(~","\u1EB5");
hashMap.put("a(.","\u1EB7"); hashMap.put("a^","\u00E2");
hashMap.put("a^'","\u1EA5"); hashMap.put("a^`","\u1EA7");
hashMap.put("a^?","\u1EA9"); hashMap.put("a^~","\u1EAB");
hashMap.put("a^.","\u1EAD"); hashMap.put("e'","\u00E9");
hashMap.put("e`","\u00E8"); hashMap.put("e?","\u1EBB");
hashMap.put("e~","\u1EBD"); hashMap.put("e.","\u1EB9");
hashMap.put("e^","\u00EA"); hashMap.put("e^'","\u1EBF");
hashMap.put("e^`","\u1EC1"); hashMap.put("e^?","\u1EC3");
hashMap.put("e^~","\u1EC5"); hashMap.put("e^.","\u1EC7");
hashMap.put("i'","\u00ED"); hashMap.put("i`","\u00EC");
hashMap.put("i?","\u1EC9"); hashMap.put("i~","\u0129");
hashMap.put("i.","\u1ECB"); hashMap.put("o'","\u00F3");
hashMap.put("o`","\u00F2"); hashMap.put("o?","\u1ECF");
hashMap.put("o~","\u00F5"); hashMap.put("o.","\u1ECD");
hashMap.put("o^","\u00F4"); hashMap.put("o^'","\u1ED1");
hashMap.put("o^`","\u1ED3"); hashMap.put("o^?","\u1ED5");
hashMap.put("o^~","\u1ED7"); hashMap.put("o^.","\u1ED9");
hashMap.put("o+","\u01A1"); hashMap.put("o+'","\u1EDB");
hashMap.put("o+`","\u1EDD"); hashMap.put("o+?","\u1EDF");
hashMap.put("o+~","\u1EE1"); hashMap.put("o+.","\u1EE3");
hashMap.put("u'","\u00FA"); hashMap.put("u`","\u00F9");
hashMap.put("u?","\u1EE7"); hashMap.put("u~","\u0169");
hashMap.put("u.","\u1EE5"); hashMap.put("u+","\u01B0");
hashMap.put("u+'","\u1EE9"); hashMap.put("u+`","\u1EEB");
hashMap.put("u+?","\u1EED"); hashMap.put("u+~","\u1EEF");
hashMap.put("u+.","\u1EF1"); hashMap.put("y'","\u00FD");
hashMap.put("y`","\u1EF3"); hashMap.put("y?","\u1EF7");
hashMap.put("y~","\u1EF9"); hashMap.put("y.","\u1EF5");
hashMap.put("dd","\u0111"); hashMap.put("A'","\u00C1");
hashMap.put("A`","\u00C0"); hashMap.put("A?","\u1EA2");
hashMap.put("A~","\u00C3"); hashMap.put("A.","\u1EA0");
hashMap.put("A(","\u0102"); hashMap.put("A('","\u1EAE");
hashMap.put("A(`","\u1EB0"); hashMap.put("A(?","\u1EB2");
hashMap.put("A(~","\u1EB4"); hashMap.put("A(.","\u1EB6");
hashMap.put("A^","\u00C2"); hashMap.put("A^'","\u1EA4");
hashMap.put("A^`","\u1EA6"); hashMap.put("A^?","\u1EA8");
hashMap.put("A^~","\u1EAA"); hashMap.put("A^.","\u1EAC");
hashMap.put("E'","\u00C9"); hashMap.put("E`","\u00C8");
hashMap.put("E?","\u1EBA"); hashMap.put("E~","\u1EBC");
hashMap.put("E.","\u1EB8"); hashMap.put("E^","\u00CA");
hashMap.put("E^'","\u1EBE"); hashMap.put("E^`","\u1EC0");
hashMap.put("E^?","\u1EC2"); hashMap.put("E^~","\u1EC4");
hashMap.put("E^.","\u1EC6"); hashMap.put("I'","\u00CD");
hashMap.put("I`","\u00CC"); hashMap.put("I?","\u1EC8");
hashMap.put("I~","\u0128"); hashMap.put("I.","\u1ECA");
hashMap.put("O'","\u00D3"); hashMap.put("O`","\u00D2");
hashMap.put("O?","\u1ECE"); hashMap.put("O~","\u00D5");
hashMap.put("O.","\u1ECC"); hashMap.put("O^","\u00D4");
hashMap.put("O^'","\u1ED0"); hashMap.put("O^`","\u1ED2");
hashMap.put("O^?","\u1ED4"); hashMap.put("O^~","\u1ED6");
hashMap.put("O^.","\u1ED8"); hashMap.put("O+","\u01A0");
hashMap.put("O+'","\u1EDA"); hashMap.put("O+`","\u1EDC");
hashMap.put("O+?","\u1EDE"); hashMap.put("O+~","\u1EE0");
hashMap.put("O+.","\u1EE2"); hashMap.put("U'","\u00DA");
hashMap.put("U`","\u00D9"); hashMap.put("U?","\u1EE6");
hashMap.put("U~","\u0168"); hashMap.put("U.","\u1EE4");
hashMap.put("U+","\u01AF"); hashMap.put("U+'","\u1EE8");
hashMap.put("U+`","\u1EEA"); hashMap.put("U+?","\u1EEC");
hashMap.put("U+~","\u1EEE"); hashMap.put("U+.","\u1EF0");
hashMap.put("Y'","\u00DD"); hashMap.put("Y`","\u1EF2");
hashMap.put("Y?","\u1EF6"); hashMap.put("Y~","\u1EF8");
hashMap.put("Y.","\u1EF4"); hashMap.put("DD","\u0110");

return (String)hashMap.get(viqr);
}

Ta cũng có thể viết một vài dòng mã kiểm thử ở phương thức main thuộc XMLFileToObject như sau:

public static void main(String[] args) throws FileNotFoundException, IOException {
XStream xStream = new XStream(new DomDriver());
xStream.alias("person", Person.class);

// name = "Nguyễn Tường Thụy"
String name = "Nguy" + UnicodeConverter.VIQRToUnicodeHex("e^~") +
"n T" + UnicodeConverter.VIQRToUnicodeHex("u+") +
UnicodeConverter.VIQRToUnicodeHex("o+`") + "ng Th" +
UnicodeConverter.VIQRToUnicodeHex("u.") + "y";

// address = "19/36D Trần Bình Trọng, P5, Q Bình Thạnh"
String address = "19/36D Tr" + UnicodeConverter.VIQRToUnicodeHex("a^`") +
"n B" + UnicodeConverter.VIQRToUnicodeHex("i`") + "nh Tr" +
UnicodeConverter.VIQRToUnicodeHex("o.") + "ng, P5, Q B" +
UnicodeConverter.VIQRToUnicodeHex("i`") + "nh Th" +
UnicodeConverter.VIQRToUnicodeHex("a.") + "nh";

Person person = new Person(name, address, 8431459);

writeXMLToFile(xStream.toXML(person), "person.xml");
}

KẾT LUẬN

Thư viện XStream tạo nên một môi trường lập trình chuyên nghiệp và dễ dàng đối với lập trình viên Java. XStream chắc chắn có những hạn chế riêng của nó, nhưng về cơ bản, nhu cầu của người lập trình khi thao tác trên đối tượng và dữ liệu của đối tượng là hoàn toàn có thể đáp ứng. Việc đọc và ghi dữ liệu hướng đối tượng xuống hệ thống tập tin chắc chắn chưa thể so sánh với mô hình cơ sở dữ liệu, nhưng phần nào giúp lập trình viên giảm thiểu những phức tạp khi thao tác trên nhiều đối tượng.

Bài viết cũng đã hỗ trợ thêm việc đọc và ghi đối tượng có sử dụng tiếng Việt thành định dạng XML thông qua thư viện XStream. Nhu cầu trước đây mà nhiều lập trình viên mong muốn đã được hiện thực, việc áp dụng tiếng Việt khi thao tác trên đối tượng và XML là hoàn toàn có thể. Điều mà đa phần các lập trình viên Việt Nam mong muốn lúc này là các IDE cũng như JDK (Java Development Kit) hỗ trợ tiếng Việt tốt hơn và hoàn thiện hơn.

TÀI LIỆU THAM KHẢO

[1] JOE WALNES, 2004. XStream Tutorial kèm theo gói chương trình XStream. http://xstream.codehaus.org/

[2] http://www.vovisoft.com, 2000. Bảng mã VIQR và Unicode Hex.

No comments: