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);
24 trang |
Chia sẻ: trungkhoi17 | Lượt xem: 507 | Lượt tải: 1
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:
- bai_giang_lap_trinh_java_chuong_4_tuan_tu_hoa_doi_tuong_va_u.pdf