CFSDN nhấn mạnh vào việc tạo ra giá trị thông qua mã nguồn mở. Chúng tôi cam kết xây dựng một nền tảng chia sẻ tài nguyên để mọi người làm CNTT có thể tìm thấy thế giới tuyệt vời của riêng mình tại đây.
Bài đăng trên blog CFSDN Java Serialization Mechanism này được tác giả thu thập và sắp xếp. Nếu bạn quan tâm đến bài viết này, vui lòng thích nó.
Trong Java, mọi thứ đều là đối tượng. Trong môi trường phân tán, đối tượng thường cần được chuyển từ đầu này của mạng hoặc thiết bị sang đầu kia. Điều này đòi hỏi một giao thức có thể truyền dữ liệu ở cả hai đầu. Cơ chế tuần tự hóa Java được tạo ra để giải quyết vấn đề này.
Sau khi chuyển đổi trạng thái đối tượng thành luồng byte, bạn có thể sử dụng nhiều lớp luồng byte khác nhau trong gói java.io để lưu luồng này vào tệp, chuyển luồng này sang luồng khác hoặc gửi dữ liệu đối tượng đến máy chủ khác thông qua kết nối mạng. Hàm tuần tự hóa đối tượng rất đơn giản và mạnh mẽ, được sử dụng trong RMI, Socket, JMS và EJB. Tuần tự hóa đối tượng không phải là chủ đề cốt lõi nhất trong lập trình mạng, nhưng nó khá quan trọng và có nhiều ý nghĩa thực tế.
Việc tuần tự hóa đối tượng Java không chỉ bảo toàn dữ liệu của một đối tượng mà còn bảo toàn đệ quy dữ liệu của từng đối tượng được đối tượng đó tham chiếu. Toàn bộ hệ thống phân cấp đối tượng có thể được ghi vào luồng byte, có thể được lưu trong tệp hoặc truyền qua kết nối mạng. Có thể sử dụng tuần tự hóa đối tượng để thực hiện "sao chép sâu" một đối tượng, nghĩa là sao chép chính đối tượng đó và đối tượng được tham chiếu. Việc tuần tự hóa một đối tượng có thể dẫn đến việc tuần tự hóa toàn bộ đối tượng đó.
Cách sử dụng cơ bản: .
Tuần tự hóa đề cập đến việc lưu trữ các lớp hoặc kiểu dữ liệu cơ bản vào các luồng dữ liệu, bao gồm tệp, luồng byte và luồng dữ liệu mạng.
Quá trình tuần tự hóa trong JAVA chủ yếu dựa vào hai lớp: ObjectOuputStream và ObjectInputStream. Chúng là lớp con của OutputStream và InputStream trong hệ thống JAVA IO. Vì chúng là luồng trong JAVA IO nên có thể vận hành như các luồng thông thường. Sau đây là cách họ sử dụng nó:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
hai mươi mốt
hai mươi hai
hai mươi ba
hai mươi bốn
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
nhập khẩu
java.io.ByteArrayInputStream;
nhập khẩu
java.io.ByteArrayOutputStream;
nhập khẩu
java.io.IOException;
nhập khẩu
java.io.ObjectInputStream;
nhập khẩu
java.io.ObjectOutputStream;
nhập khẩu
java.io.Serializable;
công cộng
lớp học
Đôi
thực hiện
Có thể tuần tự hóa
riêng tư
tĩnh
cuối cùng
dài
serialVersionUID = -1874850715617681161L;
riêng tư
số nguyên
kiểu;
riêng tư
Tên chuỗi;
công cộng
số nguyên
lấy Kiểu() {
trở lại
kiểu;
}
công cộng
vô hiệu
đặtKiểu(
số nguyên
kiểu) {
cái này
.type = kiểu;
}
công cộng
Chuỗi getName() {
trở lại
tên;
}
công cộng
vô hiệu
setName(Tên chuỗi) {
cái này
.name = tên;
}
công cộng
Đôi(
số nguyên
loại, Tên chuỗi) {
siêu
();
cái này
.type = kiểu;
cái này
.name = tên;
}
công cộng
tĩnh
vô hiệu
main(String[] args)
ném
Ngoại lệ IO, Ngoại lệ không tìm thấy lớp {
ByteArrayOutputStream bos =
mới
Dòng đầu ra ByteArray();
Dòng đối tượng đầu ra oos =
mới
ObjectOutputStream(bos);
Cặp đôi =
mới
Đôi(
1
,
"Charlie"
);
oos.writeObject(cặp);
ByteArrayInputStream bis =
mới
Dòng đầu vào ByteArray(bos.toByteArray());
ObjectInputStream ois =
mới
Dòng đầu vào đối tượng(bis);
Cặp newpair = (Cặp) ois.readObject();
Hệ thống.out.println(newpair.getType()+
":"
+newpair.getName());
}
}
|
1. Cả hai lớp này đều ở chế độ trang trí. Khi tạo chúng, một luồng dựa trên byte phải được truyền vào. Các luồng này thực sự lưu trữ dữ liệu được tuần tự hóa.
2. Lớp được lưu trữ phải triển khai giao diện Serializable, giao diện này không có bất kỳ hàm nào và chỉ là một giao diện đánh dấu. Nếu quá trình tuần tự hóa được thực hiện trên một máy và dữ liệu kết quả được chuyển sang máy khác để hủy tuần tự hóa, các lớp trên hai máy phải hoàn toàn giống nhau, nếu không quá trình tuần tự hóa sẽ không thành công.
3. Nhớ không sử dụng toString để lấy một String từ bos trong đoạn mã trên, sau đó lấy một ByteArrayInputStream từ String rồi hủy tuần tự hóa nó. BOS được lưu trữ theo byte và việc chuyển đổi nó thành String được lưu trữ theo ký tự chắc chắn sẽ gây ra những thay đổi dữ liệu và byte[] lấy được từ String sẽ không giống với byte[] như trước. Tôi gặp phải vấn đề này vì tôi muốn lưu trữ dữ liệu được tuần tự hóa trong tệp XML.
Máy ảo Java thực hiện chức năng gì trong quá trình tuần tự hóa và hủy tuần tự hóa?
Javadoc mô tả chi tiết cơ chế tuần tự hóa Java trong phần mô tả hai lớp này:
Trích dẫn.
Cơ chế tuần tự hóa mặc định cho một đối tượng ghi lớp của đối tượng, chữ ký lớp và các giá trị của tất cả các trường không tạm thời và không tĩnh. Các tham chiếu đến các đối tượng khác (trừ các trường tạm thời hoặc tĩnh) cũng khiến các đối tượng đó được ghi. Nhiều tham chiếu đến một đối tượng duy nhất được mã hóa bằng cơ chế chia sẻ tham chiếu để đồ thị của các đối tượng có thể được khôi phục về cùng hình dạng như khi bản gốc được ghi.
Cơ chế tuần tự hóa mặc định ghi dữ liệu sau vào luồng:
1. Lớp mà đối tượng thuộc về 2. Chữ ký của lớp 3. Tất cả các thuộc tính không tạm thời và không tĩnh 4. Tham chiếu đến các đối tượng khác cũng sẽ gây ra sự tuần tự hóa của các đối tượng này 5. Nếu nhiều tham chiếu trỏ đến một đối tượng, cơ chế tham chiếu chia sẻ sẽ được sử dụng.
Trích dẫn.
Các lớp yêu cầu xử lý đặc biệt trong quá trình tuần tự hóa và hủy tuần tự hóa phải triển khai các phương thức đặc biệt với các chữ ký chính xác này
?
1
2
3
4
5
6
|
riêng tư
vô hiệu
readObject(luồng java.io.ObjectInputStream)
ném
Ngoại lệ IO, Ngoại lệ không tìm thấy lớp;
riêng tư
vô hiệu
writeObject(luồng java.io.ObjectOutputStream)
ném
Ngoại lệ IO
riêng tư
vô hiệu
đọcObjectNoData()
ném
Ngoại lệ ObjectStream;
|
.
Cuối cùng, bài viết này về cơ chế tuần tự hóa Java kết thúc tại đây. Nếu bạn muốn biết thêm về cơ chế tuần tự hóa Java, vui lòng tìm kiếm các bài viết trên CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!