Mục đích của Serialization trong Java là gì?


105

Tôi đã đọc khá nhiều bài báo về Serialization và thấy nó rất hay và tuyệt vời nhưng không có lập luận nào đủ thuyết phục. Tôi đang tự hỏi liệu ai đó có thể thực sự cho tôi biết điều gì mà chúng tôi thực sự có thể đạt được bằng cách tuần tự hóa một lớp học không?


10
Điều gì "không thuyết phục" về lập luận của họ? Và tại sao bạn vẫn chưa chấp nhận bất kỳ câu trả lời nào cho câu hỏi của bạn?
Anon.

8
Anh "không bị thuyết phục" họ trả lời câu hỏi của anh.
Anthony Forloney

5
Các câu trả lời được cung cấp, trên thực tế, là đúng. Nếu chúng không hiệu quả với bạn, hãy trả lời chúng dưới dạng nhận xét và cố gắng giải quyết vấn đề đó thay vì chỉ phớt lờ chúng và sau đó bắt đầu truyền lửa cho người khác khi họ chỉ ra rằng bạn đang sử dụng SO không đúng.
Anon.

4
Anon đang đóng góp vào chất lượng của trang web bằng cách không khuyến khích các câu hỏi trùng lặp. Thật ngớ ngẩn khi thấy năm câu hỏi riêng biệt đều hỏi cùng một thứ. Nếu bạn không thể nhận được câu trả lời, thì đôi khi đó chỉ là cách của nó. Nếu bạn nhận được câu trả lời nhưng nó có vẻ không hiệu quả, thì hãy tiếp tục thảo luận trong phần bình luận. VẬY không phải là chiếc hộp ma thuật sẽ cho bạn câu trả lời một cách thần kỳ nếu bạn chỉ hỏi đúng câu hỏi, hoặc hỏi đủ lần, hoặc lọt vào mắt xanh của đúng chuyên gia.
Chris

1
Hoặc: (Chấp nhận câu trả lời) hoặc (Đăng nhận xét và / hoặc sửa đổi câu hỏi giải thích tại sao nó không phải là thứ bạn cần).
Anon.

Câu trả lời:


182

Trước tiên, hãy xác định tuần tự hóa, sau đó chúng ta có thể nói về lý do tại sao nó rất hữu ích.

Serialization chỉ đơn giản là chuyển một đối tượng hiện có thành một mảng byte. Mảng byte này đại diện cho lớp của đối tượng, phiên bản của đối tượng và trạng thái bên trong của đối tượng. Mảng byte này sau đó có thể được sử dụng giữa các JVM đang chạy cùng một mã để truyền / đọc đối tượng.

Tại sao chúng tôi muốn làm điều này?

Có một số lý do:

  • Giao tiếp: Nếu bạn có hai máy đang chạy cùng một mã và chúng cần giao tiếp, thì một cách dễ dàng là một máy tạo một đối tượng với thông tin mà nó muốn truyền, sau đó tuần tự hóa đối tượng đó cho máy kia. Nó không phải là phương pháp tốt nhất để giao tiếp, nhưng nó sẽ hoàn thành công việc.

  • Tính liên tục: Nếu bạn muốn lưu trữ trạng thái của một thao tác cụ thể trong cơ sở dữ liệu, nó có thể dễ dàng được tuần tự hóa thành một mảng byte và được lưu trữ trong cơ sở dữ liệu để truy xuất sau này.

  • Bản sao sâu: Nếu bạn cần một bản sao chính xác của một Đối tượng và không muốn gặp rắc rối khi viết lớp clone () chuyên dụng của riêng bạn, chỉ cần tuần tự hóa đối tượng thành một mảng byte, rồi hủy tuần tự hóa nó sang một lớp khác đối tượng đạt được mục tiêu này.

  • Bộ nhớ đệm: Thực sự chỉ là một ứng dụng ở trên, nhưng đôi khi một đối tượng mất 10 phút để xây dựng, nhưng sẽ chỉ mất 10 giây để hủy tuần tự hóa. Vì vậy, thay vì giữ đối tượng khổng lồ trong bộ nhớ, chỉ cần lưu trữ nó vào một tệp thông qua tuần tự hóa và đọc nó sau khi cần.

  • Đồng bộ hóa JVM chéo: Việc tuần tự hóa hoạt động trên các JVM khác nhau có thể đang chạy trên các kiến ​​trúc khác nhau.


62
Cái gì trên trái đất mất 10 phút để xây dựng?
oxbow_lakes

2
Quan điểm của tôi là (tất nhiên) rằng tệp I / O liên quan đến tuần tự hóa có thể sẽ làm giảm chi phí tạo đối tượng thuần túy. Tôi cho rằng bạn có thể nói về một cái gì đó tính toán rất tốn kém như mô hình khoa học nhưng serialization là một cơ chế rất nghèo cho persistence do nó quá khó để thay đổi sơ đồ xử lý
oxbow_lakes

11
@oxbow_lakes Một ví dụ có thể là nếu bạn duy trì chỉ mục của một bộ dữ liệu cụ thể để tìm kiếm nhanh. Một chỉ mục như vậy có thể mất rất nhiều thời gian để xây dựng, nhưng khi bạn đã xây dựng nó, nó có thể được tuần tự hóa / hủy tuần tự hóa tương đối nhanh chóng.
David

Nếu yêu cầu ứng dụng web phải đi qua từng bộ định tuyến trên toàn cầu trước khi đến đích, đối tượng đang xây dựng, quay lại đối tượng bằng đường dẫn dài nhất có thể, thì có thể mất 10 phút.
Vaibs

@Schmelter, Vì bạn đề cập đến Serialization không phải là phương pháp tốt nhất để giao tiếp, nên phương pháp nào phù hợp và tốt nhất được thực hiện sau đó?
Ashfaque Rifaye

58

Trong khi bạn đang chạy ứng dụng của mình, tất cả các đối tượng của nó được lưu trữ trong bộ nhớ (RAM). Khi bạn thoát ra, bộ nhớ đó sẽ được hệ điều hành lấy lại và chương trình của bạn về cơ bản 'quên' mọi thứ đã xảy ra khi nó đang chạy. Việc tuần tự hóa khắc phục điều này bằng cách cho phép ứng dụng của bạn lưu các đối tượng vào đĩa để nó có thể đọc lại chúng vào lần khởi động tiếp theo. Nếu ứng dụng của bạn sẽ cung cấp bất kỳ cách nào để lưu / chia sẻ trạng thái trước đó, bạn sẽ cần một số hình thức tuần tự hóa.


2
Vì vậy, có vẻ như nó chỉ là một cách tốt hơn, hiệu quả hơn để ghi dữ liệu vào tệp và đọc lại khi cần?
m_a_khan

1
Đây là lời giải thích THỰC SỰ duy nhất. Tôi không thể nghĩ ra bất kỳ ứng dụng thực tế nào khác của tuần tự hóa +1
Emily

Ngắn và ngọt. Lời giải thích hoàn hảo.
Yakhoob

21

Tôi có thể chia sẻ câu chuyện của mình và tôi hy vọng nó sẽ cung cấp một số ý tưởng tại sao việc đăng nhiều kỳ là cần thiết. Tuy nhiên, câu trả lời cho câu hỏi của bạn đã rất chi tiết.

Tôi có một số dự án cần tải và đọc một loạt các tệp văn bản. Các tệp chứa các từ dừng, động từ y sinh, chữ viết tắt y sinh, các từ được kết nối ngữ nghĩa với nhau, v.v. Nội dung của các tệp này rất đơn giản: từ !

Bây giờ đối với mỗi dự án, tôi cần đọc các từ từ mỗi tệp này và đặt chúng vào các mảng khác nhau; vì nội dung của tệp không bao giờ thay đổi, nó trở thành một nhiệm vụ phổ biến, tuy nhiên thừa, sau dự án đầu tiên.

Vì vậy, những gì tôi đã làm là tôi tạo một đối tượng để đọc từng tệp này và điền vào các mảng riêng lẻ (biến cá thể của các đối tượng). Sau đó, tôi tuần tự hóa các đối tượng và sau đó cho các dự án sau này, tôi chỉ đơn giản là deserialized chúng. Tôi không phải đọc các tệp và điền các mảng lặp đi lặp lại.


1
Trong trường hợp như vậy, tại sao bạn cần lưu trữ chúng trong luồng mảng byte (sử dụng tuần tự hóa), nó có thể đơn giản hơn là chỉ sử dụng một trường tạm thời không?
kidnan1991

3

Trong essense :

Serialization là quá trình chuyển đổi một tập hợp các cá thể đối tượng có chứa các tham chiếu đến nhau thành một dòng tuyến tính của các byte, sau đó có thể được gửi qua một socket, được lưu trữ vào một tệp hoặc chỉ được thao tác dưới dạng một dòng dữ liệu

Xem công dụng từ Wiki :

Serialization có một số ưu điểm. Nó cung cấp:

  1. một phương pháp duy trì các đối tượng thuận tiện hơn việc ghi các thuộc tính của chúng vào một tệp văn bản trên đĩa và tập hợp lại chúng bằng cách đọc lại phần này.
  2. một phương pháp phát lệnh gọi thủ tục từ xa, ví dụ như trong SOAP
  3. một phương pháp để phân phối các đối tượng, đặc biệt là trong cấu phần phần mềm như COM, CORBA, v.v.
  4. một phương pháp để phát hiện những thay đổi trong dữ liệu thay đổi theo thời gian.

1

Rõ ràng nhất là bạn có thể truyền lớp được tuần tự hóa qua mạng và người nhận có thể tạo một bản sao của bản thể hiện ban đầu. Tương tự như vậy, bạn có thể lưu cấu trúc tuần tự vào hệ thống tệp.

Ngoài ra, lưu ý rằng tuần tự hóa là đệ quy, vì vậy bạn có thể tuần tự hóa toàn bộ cấu trúc dữ liệu không đồng nhất trong một lần lặp lại, nếu muốn.


0

Các đối tượng được tuần tự hóa duy trì trạng thái trong không gian, chúng có thể được chuyển qua mạng, hệ thống tệp, v.v. và theo thời gian, chúng có thể tồn tại lâu hơn JVM đã tạo ra chúng.

Đôi khi điều này hữu ích.


Điều này có thể đạt được với một tệp đơn giản cũng chứa một số văn bản. Sẽ dễ dàng hơn một chút khi đọc ngược một đối tượng được tuần tự hóa sau đó đọc trạng thái của đối tượng được ghi vào tệp văn bản, đúng không?
m_a_khan

@m_a_khan: Chà. Có, nó có thể được thực hiện với một văn bản đơn giản. Nhưng ngay sau khi các Đối tượng trở nên phức tạp hơn, hoặc cấu trúc của chúng (tổng hợp, kế thừa) trở nên phức tạp hơn, thì việc sắp xếp (bỏ) chúng theo cách thủ công sẽ trở nên phức tạp. Hãy tưởng tượng có danh sách, tập hợp và bản đồ là thành viên đối tượng.
Dirk Schumacher

Thật dễ dàng để đưa ra các kế hoạch tuần tự hóa khác nhau và thực sự có nhiều kế hoạch tồn tại. Vì lý do rất tốt, không ai trong số họ gây ra trong trường hợp tổng quát, trong một "văn bản đơn giản"
David Soroko

0

Tôi sử dụng các đối tượng được tuần tự hóa để chuẩn hóa các đối số mà tôi truyền cho hàm hoặc hàm tạo lớp. Truyền một bean tuần tự sẽ gọn gàng hơn nhiều so với một danh sách dài các đối số. Kết quả là mã dễ đọc và gỡ lỗi hơn.


1
Theo ý kiến ​​của tôi, việc biên tập hóa và sử dụng một đối tượng cấu hình duy nhất làm tham số là khá trực giao. Có lẽ đây không phải là một trường hợp sử dụng điển hình.
Gábor Bakos

0

Đối với mục đích đơn giản của việc học (để ý, tôi đã nói là học, tôi không nói là tốt nhất, hay thậm chí là tốt, nhưng chỉ để hiểu nội dung), bạn có thể lưu dữ liệu của mình vào một tệp văn bản trên máy tính, sau đó có một chương trình. đọc thông tin đó và dựa trên tệp, bạn có thể yêu cầu chương trình của mình phản hồi theo cách khác. Nếu bạn nâng cao hơn, nó không nhất thiết phải là tệp txt mà là một cái gì đó khác.

Mặt khác, sắp xếp thứ tự, đưa mọi thứ trực tiếp vào ngôn ngữ máy tính. Nó giống như bạn đang nói với một máy tính Tây Ban Nha điều gì đó bằng tiếng Tây Ban Nha, thay vì nói điều gì đó bằng tiếng Pháp, buộc nó phải học tiếng Pháp, sau đó lưu mọi thứ sang tiếng Tây Ban Nha bản địa của nó bằng cách dịch mọi thứ. Không phải là câu trả lời chuyên sâu về công nghệ, tôi chỉ đang cố gắng tạo ra một ví dụ dễ hiểu ở định dạng ngôn ngữ chung.

Việc tuần tự hóa cũng nhanh hơn, vì trong Java, các đối tượng được xử lý trên heap và mất nhiều thời gian hơn nếu chúng được biểu diễn dưới dạng nguyên thủy trên ngăn xếp. Tốc độ, tốc độ, tốc độ. Và ít xử lý tệp hơn từ quan điểm của lập trình viên.


Trong khi cố gắng đưa mọi thứ bằng tiếng Anh thuần túy, bạn vẫn chưa thực sự giải thích việc tuần tự hóa theo bất kỳ cách hữu ích nào.
dùng3516726
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.