Gửi bởi
Admin
Sao bạn Wazi Armstrong lại có ý định giải thích cho Kevin Hoang về Serializable nhỉ? Mình có đọc và thấy là bạn viết rất lý thuyết và có phần tương đối là 'bác học'. [IMG]images/smilies/biggrin.png[/IMG]
Mình có một câu hỏi mong bạn Wazi Armstrong giúp đỡ: Theo những gì bạn đã viết ở trên, bạn sẽ Serializable đối tượng InputStream như thế nào? Nếu có ví dụ thì có lẽ là tốt biết nhường nào.
Trả lời câu hỏi nhanh của bác: Đối tượng InputStream sẽ serialize được. Nhưng theo như Kevin đã đề cập, nó sẽ ko mang lại những gì bạn mong đợi (đọc thông tin từ một stream).
Về cái java.io.Serializable em xin lỗi là em nhầm lẫn với cơ chế serialize của thằng GWT. Thằng này cũng serial object nhưng không phải ra xml mà là ra 1 chuỗi bình thường (debug thì thấy nó ra 1 chuỗi loằng ngoằng theo cách riêng của nó). Những điều kiện để thằng GWT này serialize được Object như em đã đề cập.
Còn về việc serialize object ra XML: Nói đơn giản là bạn không thể nhồi vào XML những thông tin ngoài khả năng biểu diễn của XML. Vì thế khi serialize 1 đối tượng InputStream, khi client invoke webservice đối tượng trả ra sẽ không có các phương thức như mong đợi, mà chỉ còn các property (get/set, các field public).
Lấy một ví dụ cho dễ hiểu, mình tận dụng luôn câu hỏi của chủ thớt:
Mã:
@WebMethod(operationName="foo") public MyInputStream foo() { try { return new MyInputStream("/Users/wazi/test.txt"); } catch (FileNotFoundException e) { e.printStackTrace(); return null; } } public static class MyInputStream extends FileInputStream { public String xxx; public int getBar() { return 0; } public void setBar(int bar) { //do nothing } public int calcBar() { return 1+3; } public MyInputStream(String name) throws FileNotFoundException { super(name); } }
Sau khi serialize thì kiểu MyInputStream sẽ được biểu diễn như sau
Mã:
<xs:complexType name="myInputStream"><xs:complexContent><xs:extension base="tns:fileInputStream"><xs:sequence><xs:element name="xxx" type="xs:string" minOccurs="0"></xs:element><xs:element name="bar" type="xs:int"></xs:element></xs:sequence></xs:extension></xs:complexContent></xs:complexType> <xs:complexType name="fileInputStream"><xs:complexContent><xs:extension base="tns:inputStream"><xs:sequence></xs:sequence></xs:extension></xs:complexContent></xs:complexType> <xs:complexType name="inputStream" abstract="true"><xs:sequence></xs:sequence></xs:complexType>
Ta có thể thấy property bar (cặp get/set) tạo nên element bar trong xml (dù lớp MyInputStream không có field nào tên là bar). Bên cạnh đó field String xxx cũng được thể hiện trong schema vì nó là public (nhìn thấy được từ bên ngoài). Cũng theo như schema trên ta có thể thấy rằng FileInputStream hay InputStream chẳng có thông tin gì, đơn giản vì nó ko có property nào public để serialize (từ đây xin gọi chung public field và cặp set/get là property).
Một điểm nữa là Client hoàn toàn không biết gì về cấu trúc cái class mà bạn định nghĩa trong Java Code, cái nó biết duy nhất là wsdl. Dựa vào thông tin schema cung cấp client sẽ tạo ra những class tương ứng để phục vụ việc lập trình của bạn dễ dàng hơn (Điều này là không bắt buộc vì bạn hoàn toàn có thể gọi webservice mà chẳng cần phải sinh ra cái class nào, tất cả chỉ là xml). Để minh chứng cho ý này, đặc biệt là câu đầu tiên của đoạn này, mình gen code client bằng Axis 2. Kết quả như sau:
Mã:
public static class MyInputStream extends FileInputStream implements org.apache.axis2.databinding.ADBBean { protected java.lang.String localXxx; protected boolean localXxxTracker = false; public boolean isXxxSpecified() { return localXxxTracker; } public java.lang.String getXxx() { return localXxx; } public void setXxx(java.lang.String param) { localXxxTracker = param != null; this.localXxx = param; } protected int localBar; public int getBar() { return localBar; } public void setBar(int param) { this.localBar = param; } //....}
Chúng ta có thể thấy lớp MyInputStream tạo ở client không hoàn toàn giống như lớp MyInputStream ở phía server (web service). Đơn giản vì client đâu có biết lớp này [IMG]images/smilies/biggrin.png[/IMG] Nếu view code sâu hơn các bạn có thể thấy các lớp InputStream, FileInputStream cũng được sinh ra, hoàn toàn dựa theo schema nên không phải thuộc gói java.io, và tất nhiên là chúng chẳng có những phương thức như mong đợi (readByte, read...).
Sau ví dụ này mọi thứ có vẻ đã khá rõ ràng, mình sẽ không kết luận gì nữa.
Bổ sung thêm 1 xíu là trên cách serialize (Data Binding) trên đây là hoàn toàn tự động. Bạn hoàn toàn có thể dùng các config (annotation) của JAXB để điều chỉnh sao cho schema đầu ra như mong muốn.
PS: Lâu rồi mình không code, chỉ làm ở mức design nên bạn Admin nói mình lý thuyết cũng có phần nào đúng.
Vệ sinh cá nhân là một phần quan yếu của sức khỏe nam giới. Dùng dung dịch vệ sinh mỗi ngày mang lại nhiều ích, giúp loại bỏ vi khuẩn và vi sinh vật gây hại, giúp khu vực cơ quan sinh dục luôn sạch...
Gel vệ sinh cu, bạn trai có nên...