Bài giảng Lập trình Java - Chương 4: Tuần tự hóa đối tượng và ứng dụng trong lập trình mạng - Nguyễn Minh Thành

Ví dụ : đọc/ ghi đối tượng Date

//Ghi đối tượng

FileOuputStream fos=new FileOuputStream("date.out");

ObjectOuputStream oos=new ObjectOuputStream(fos);

Date d=new Date();

oos.writeObject(d);

//Đọc đối tượng

FileInputStream fis=new FileInputStream("date.out");

ObjectInputStream ois=new ObjectInputStream(fis);

Date d=(Date)ois.readObject();

QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA

Tuần tự hóa đối tượng

9Ví dụ : đọc ghi đối tượng Phân

Số

public class PhanSo implements Serializable

{

protected inttu,mau;

private transient floatval=0;

publicPhanSo()

{ tu=0;

mau=1;

}

publicPhanSo(inttu, intmau){

this.tu=tu;

this.mau=mau;

val=(float)tu/mau;

}

public String toString() {

return tu+"/"+mau+" ("+val+")";

}

}

QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA

Tuần tự hóa đối tượng

10Ví dụ : đọc ghi đối tượng Phân

Số (tt)

// Ghi dữliệu

FileOutputStream fo=new FileOutputStream("C:\\TestO.bin");

BufferedOutputStream bo=new BufferedOutputStream(fo);

ObjectOutputStream oo=new ObjectOutputStream(bo);

System.out.println("Du lieu ghi duoc:");

for(int i=0;i<4;i++)

{

int tu =(int)(Math.random()*10);

int mau=(int)(Math.random()*9)+1;

PhanSo ps = new PhanSo(tu,mau);

oo.writeObject(ps);

System.out.println(ps);

pdf24 trang | Chia sẻ: trungkhoi17 | Lượt xem: 507 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Bài giảng Lập trình Java - Chương 4: Tuần tự hóa đối tượng và ứng dụng trong lập trình mạng - Nguyễn Minh Thành, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Chương 4: Tuần tự hóa đối tượng và ứng dụng trong lập trình mạng GIẢNG VIÊN : THS . NGUYỄN MINH THÀNH EMAIL : THANHNM@ITC.EDU.VN Nội Dung 1. Tuần tự hóa đối tượng trong Java 2. Truyền đối tượng khả tuần tự qua mạng MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 2 Tuần tự hóa đối tượng (object serialization)  Một chương trình có thể chứa những đối tượng dữ liệu rất phức tạp.  Object serialization là khả năng biến đổi một đối tượng thành một dãy byte để lưu trữ trên bộ nhớ phụ hoặc truyền đi nơi khác (quan mạng).  Object serialization đã được tự động hóa hoàn toàn và hầu như lập trình viên không phải làm gì thêm. Để một đối tượng có thể được "serialize", ta chỉ cần cho nó implement interface Serializable. Mọi việc sau đó như đọc/ghi/truyền/nhận đều do Java thực hiện. QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA Tuần tự hóa đối tượng 3 Tuần tự hóa đối tượng (object serialization) Một số lưu ý: Chỉ có các thuộc tính (dữ liệu) của đối tượng mới được serialize. Các thuộc tính được đánh dấu bằng từ khóa transient(nghĩa là có tính tạm thời) sẽ không được serialize. Sau khi serialize, trạng thái của đối tượng được lưu trữ trên bộ nhớ ngoài được gọi là persistence (nghĩa là được giữ lại một cách bền vững). QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA Tuần tự hóa đối tượng 4 Ví dụ public class HocSinh implements Serializable { protected String hoTen; protected int namSinh; protected float diemVan, diemToan; protected transient float diemTrungBinh; // ... } QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA Tuần tự hóa đối tượng 5 Các đối tượng built-in có thể tuần tự hóa QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA Tuần tự hóa đối tượng 6 Một số đối tượng được xây dựng sẵn trong thư viện của Java cũng có thể tuần tự hóa :  java.util.Date  java.io.File  Tuy nhiên, cũng có một số lớp không thể tuần tự hóa như  java.net.Socket  java.io.InputStream  Để kiểm tra lớp có thể tuần tự hóa hay không : sử dụng tool serialver trong bộ JDK Luồng đọc và ghi đối tượng khả tuần tự Trong Java, các lớp đảm nhận việc đọc/ghi đối tượng khả tuần gồm: • ObjectInputStream: đọc dãy byte và chuyển thành đối tượng phù hợp. • ObjectOutputStream: chuyển đối tượng thành dãy byte và ghi. 2 hàm trên được sử dụng kết hợp với các luồng khác để ghi/ đọc dữ liệu ra/từ file. QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA Tuần tự hóa đối tượng 7 Luồng đọc và ghi đối tượng khả tuần tự Cơ chế đọc và ghi đối tượng khả tuần tự QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA Tuần tự hóa đối tượng 8 Ví dụ : đọc/ ghi đối tượng Date //Ghi đối tượng FileOuputStream fos=new FileOuputStream("date.out"); ObjectOuputStream oos=new ObjectOuputStream(fos); Date d=new Date(); oos.writeObject(d); //Đọc đối tượng FileInputStream fis=new FileInputStream("date.out"); ObjectInputStream ois=new ObjectInputStream(fis); Date d=(Date)ois.readObject(); QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA Tuần tự hóa đối tượng 9 Ví dụ : đọc ghi đối tượng Phân Số public class PhanSo implements Serializable { protected inttu,mau; private transient floatval=0; publicPhanSo() { tu=0; mau=1; } publicPhanSo(inttu, intmau){ this.tu=tu; this.mau=mau; val=(float)tu/mau; } public String toString() { return tu+"/"+mau+" ("+val+")"; } } QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA Tuần tự hóa đối tượng 10 Ví dụ : đọc ghi đối tượng Phân Số (tt) // Ghi dữliệu FileOutputStream fo=new FileOutputStream("C:\\TestO.bin"); BufferedOutputStream bo=new BufferedOutputStream(fo); ObjectOutputStream oo=new ObjectOutputStream(bo); System.out.println("Du lieu ghi duoc:"); for(int i=0;i<4;i++) { int tu =(int)(Math.random()*10); int mau=(int)(Math.random()*9)+1; PhanSo ps = new PhanSo(tu,mau); oo.writeObject(ps); System.out.println(ps); } oo.close(); QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA Tuần tự hóa đối tượng 11 Ví dụ : đọc ghi đối tượng Phân Số (tt) // Đọc dữliệu FileInputStream fi=new FileInputStream("C:\\TestO.bin"); BufferedInputStream bi=new BufferedInputStream(fi); ObjectInputStream oi=new ObjectInputStream(bi); System.out.println("\nDu lieu doc duoc:"); while(bi.available()>0) { PhanSo ps=(PhanSo)oi.readObject(); System.out.println(ps); } oi.close(); QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA Tuần tự hóa đối tượng 12 Truyền đối tượng khả tuần tự qua TCP Socket Mô hình truyền đối tượng khả tuần tự qua TCP Socket QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA 13 Tuần tự hóa đối tượng Truyền đối tượng khả tuần tự qua TCP Socket (tt) Giả sử có một Socket s, ta sẽ nhận dũ liệu từ luồng nhập : InputStream is=s.getInputStream() ; ObjectInputStream ois=new ObjectInputStream(is); Object obj=(Object)ois.readObject(); Gửi dữ liệu qua luồng xuất đối tượng: ObjectOuput os=s.getObjectOuput(); ObjectOuputStream oos=new ObjectOutputStream(os); oos.writeObject(obj); oos.flush(); QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA 14 Tuần tự hóa đối tượng Ví dụ : Truyền đối tượng khả tuần tự qua TCP Xây dựng lớp đối tượng khả tuần tự : public class ArrayObject implements java.io.Serializable{ private int[] a=null; public ArrayObject(){ } public void setArray(int a[]){ this.a=a; } public int[] getArray(){ return a; } } QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA 15 Tuần tự hóa đối tượng Ví dụ : Truyền đối tượng khả tuần tự qua TCP (tt) Xây dựng Client public class ArrayClient{ public static void main(String[] args)throws Exception{ ObjectOutputStream oos=null; ObjectInputStream ois=null; int dat1[]={3,3,3,3,3,3,3}; int dat2[]={5,5,5,5,5,5,5}; Socket s=new Socket("localhost",1234); oos=new ObjectOutputStream(s.getOutputStream()); ois=new ObjectInputStream(s.getInputStream()); ArrayObject a1=new ArrayObject(); a1.setArray(dat1); QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA 16 Tuần tự hóa đối tượng Ví dụ : Truyền đối tượng khả tuần tự qua TCP (tt) Xây dựng Client (tt) ArrayObject a2=new ArrayObject(); a2.setArray(dat2); ArrayObject res=null; int r[]=new int[7]; oos.writeObject(a1); oos.writeObject(a2); oos.flush(); res=(ArrayObject)ois.readObject(); r=res.getArray(); System.out.println("The result received from server..."); System.out.println(); for(int i=0;i<r.length;i++) System.out.print(r[i]+" "); } } QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA 17 Tuần tự hóa đối tượng Ví dụ : Truyền đối tượng khả tuần tự qua TCP (tt) Xây dựng Server ServerSocket ss=new ServerSocket(1234); System.out.println("Server running on port "+1234); System.out.println("Waiting for client..."); Socket s=ss.accept(); System.out.println("Accepting a connection from:"+s.getInetAddress()); ObjectInputStream ois=new ObjectInputStream(s.getInputStream()); ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream()); QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA 18 Tuần tự hóa đối tượng Ví dụ : Truyền đối tượng khả tuần tự qua TCP (tt) Xây dựng Server (tt) ArrayObject x=(ArrayObject)ois.readObject(); ArrayObject y=(ArrayObject)ois.readObject(); int a1[]=x.getArray(); int a2[]=y.getArray(); int r[]=new int[7]; for(int i=0;i<a1.length;i++) r[i]=a1[i]*a2[i]; ArrayObject res=new ArrayObject(); res.setArray(r); oos.writeObject(res); oos.flush(); ois.close(); s.close(); QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA 19 Tuần tự hóa đối tượng Truyền đối tượng khả tuần tự qua UDP Mô hình truyền đối tượng khả tuần tự qua UDP Socket QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA 20 Tuần tự hóa đối tượng Truyền đối tượng khả tuần tự qua UDP (tt) Các bước thực hiện : Bước 1. Tạo đối tượng cần truyền đi khả tuần tự thực thi giao diện Serializable Bước 2. Tạo một luồng ByteArrayObjectOuputvà đặt tên cho nó là baos. Bước 3. Xây dựng đối tượng ObjectOuputStreamvà đặt tên cho nó là oos. Tham số cho đối tượng ObjectOuputStream là baos Bước 4. Ghi đối tượng obj vào luồng baos bằng cách sử dụng phương thức writeObject() của oos. Bước 5. Tìm kiếm vùng đệm dữ liệu mảng byte từ bằng cách sử dụng phương thức toByteAray(). Bước 6. Xây dựng đối tượng DatagramPacket và đặt tên là dp với dữ liệu đầu vào là vùng đệm dữ liệu đã tìm được ở bước 5. Bước 7. Gửi dp thông qua DatagramSocket bằng cách gọi phương thức send() của nó. QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA 21 Tuần tự hóa đối tượng Ví dụ : Truyền đối tượng khả tuần tự qua UDP //Gửi đối tượng InetAddress server=InetAddress.getByName("localhost"); int serverPort = 1234; int clientPort = 1235; ArrayObject obj1 = new ArrayObject(); int dat1[]={3,3,3,3,3,3,3}; obj1.setArray(dat1); DatagramSocket ds=new DatagramSocket(clientPort); ByteArrayOutputStream baos=new ByteArrayOutputStream(5000); ObjectOutputStream oos=new ObjectOutputStream(new BufferedOutputStream(baos)); oos.flush(); oos.writeObject(obj1); oos.flush(); byte[] byteSend=baos.toByteArray(); DatagramPacket dpSend=new DatagramPacket(byteSend,byteSend.length,server,serverPort); ds.send(dpSend); oos.close(); QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA 22 Tuần tự hóa đối tượng Ví dụ : Truyền đối tượng khả tuần tự qua UDP //Nhận đối tượng DatagramSocket ds=new DatagramSocket(1234); while(true){ byte b[]=new byte[5000]; DatagramPacket dp=new DatagramPacket(b,b.length); ds.receive(dp); ByteArrayInputStream bais; bais=new ByteArrayInputStream(b); ObjectInputStream ois =new ObjectInputStream(bais); ArrayObject obj = (ArrayObject)ois.readObject(); int[] arr = obj.getArray(); System.out.println("Data from client : "); for(int i=0; i<arr.length;i++){ System.out.print(arr[i] + " "); } ois.close(); bais.close(); } QUẢN LÝ ĐỊA CHỈ KẾT NỐI MẠNG TRONG JAVA 23 Tuần tự hóa đối tượng Hết Chương 4

Các file đính kèm theo tài liệu này:

  • pdfbai_giang_lap_trinh_java_chuong_4_tuan_tu_hoa_doi_tuong_va_u.pdf
Tài liệu liên quan