JavaRush /Blog Java /Random-VI /13 câu hỏi hàng đầu về việc đăng nhiều kỳ trong các cuộc ...
Dmitry Vasilyev
Mức độ
Саратов

13 câu hỏi hàng đầu về việc đăng nhiều kỳ trong các cuộc phỏng vấn

Xuất bản trong nhóm
Bản dịch bài viết https://javarevisited.blogspot.com/2011/04/top-10-java-serialization-interview.html Tuần tự hóa trong Java là gì? Tuần tự hóa là một trong những khái niệm quan trọng hiếm khi được sử dụng như một giải pháp để lưu trạng thái của chương trình và do đó API này thường bị các nhà phát triển bỏ qua. Tuy nhiên, theo kinh nghiệm của tôi, tuần tự hóa là một chủ đề khá quan trọng trong bất kỳ cuộc phỏng vấn Java cơ bản nào. Hầu hết mọi cuộc phỏng vấn tôi gặp đều có một hoặc hai câu hỏi về việc đăng nhiều kỳ, và tôi thấy các ứng viên cảm thấy không thoải mái về việc họ thiếu kinh nghiệm trong lĩnh vực này sau một vài câu hỏi về chủ đề này. Họ không biết cách tuần tự hóa một đối tượng trong Java, họ không quen với bất kỳ ví dụ nào về tuần tự hóa và không thể giải thích cơ chế hoạt động của nó, sự khác biệt giữa biến nhất thời và biến dễ bay hơi, họ không biết giao diện Serializable có bao nhiêu phương thức có. Giao diện điểm đánh dấu là gì? Mục đích của nó là gì? Sự khác biệt giữa triển khai Bên ngoài và Có thể tuần tự hóa trong Java là gì? Tại sao java không thay thế Serializable bằng @Serializable sau khi giới thiệu chú thích? Trong bài viết này, chúng tôi sẽ đề cập đến các câu hỏi dành cho cả người mới bắt đầu và nhà phát triển nâng cao, những câu hỏi này có thể hữu ích như nhau cho tất cả mọi người: từ cấp dưới đến nhà phát triển cấp cao. Hầu hết các dự án thương mại đều sử dụng cơ sở dữ liệu, tệp ánh xạ bộ nhớ hoặc chỉ các tệp phẳng đơn giản để mang lại độ tin cậy cao hơn, nhưng ít dự án dựa vào quy trình tuần tự hóa của Java. Trong mọi trường hợp, bài đăng này không phải là một hướng dẫn - nó là về những câu hỏi đáng để bạn tự làm rõ trước khi tham gia bất kỳ cuộc phỏng vấn Java nào và bị ngạc nhiên bởi những thuật ngữ mà chính bạn chưa biết. Dành cho những người chưa quen với việc tuần tự hóa Java: “Tuần tự hóa trong Java là một quá trình được sử dụng để tuần tự hóa một đối tượng trong Java bằng cách lưu trữ trạng thái của đối tượng trong một tệp có phần mở rộng .ser và tạo lại trạng thái của đối tượng từ tập tin này. Quá trình ngược lại này được gọi là quá trình khử lưu huỳnh. mộ API tuần tự hóa Java cung cấp cho các nhà phát triển một cơ chế tiêu chuẩn để tuần tự hóa các đối tượng bằng cách sử dụng các giao diện Có thể tuần tự hóa và Có thể bên ngoài. Nhân tiện, bài viết này là phần tiếp theo của các bài viết trước của tôi ( không phải của tôi, người dịch, mà là tác giả của bản gốc tiếng Anh) : 20 câu hỏi phỏng vấn về các mẫu thiết kế10 câu hỏi phỏng vấn về mẫu Singleton trong Java . Vì vậy, chúng ta hãy đi! Tuần tự hóa trong Java là gì? Tuần tự hóa đối tượng trong Java là một quá trình được sử dụng để chuyển đổi một đối tượng thành định dạng nhị phân có thể được lưu vào đĩa hoặc gửi qua mạng tới bất kỳ máy ảo Java đang chạy nào khác; quá trình ngược lại của việc tạo một đối tượng từ luồng nhị phân được gọi là quá trình giải tuần tự hóa. Java cung cấp một API bao gồm java.io.Serializable, java.io.Externalizable, ObjectInputStream và ObjectOutputStream, v.v. Các lập trình viên có thể tự do sử dụng cơ chế tuần tự hóa mặc định mà Java sử dụng dựa trên cấu trúc lớp, nhưng họ cũng có thể sử dụng định dạng nhị phân tùy chỉnh của riêng mình, thường được khuyến nghị là cách thực hành tốt nhất về tuần tự hóa vì định dạng nhị phân được tuần tự hóa trở thành một phần của API được xuất của lớp và có khả năng phá vỡ tính đóng gói trong Java được cung cấp bởi các trường riêng tư và gói riêng tư . Nói chung, thông tin này sẽ khá đủ để bắt đầu. Làm cách nào để tuần tự hóa một lớp Java? Nó rất dễ. Lớp của bạn chỉ cần triển khai giao diện java.io.Serializable và JVM sẽ đảm nhiệm việc tuần tự hóa đối tượng theo định dạng mặc định. Quyết định tạo một lớp có thể tuần tự hóa phải được đưa ra một cách ngắn gọn vì mặc dù chi phí ngắn hạn để tạo một lớp có thể tuần tự hóa là thấp nhưng chi phí dài hạn lại rất đáng kể và có thể hạn chế khả năng của bạn trong việc thực hiện các sửa đổi tiếp theo đối với việc triển khai. Điều này xảy ra bởi vì, giống như bất kỳ API công khai nào, dạng tuần tự hóa của một đối tượng sẽ trở thành một phần của API công khai và khi bạn thay đổi cấu trúc của lớp bằng cách triển khai giao diện thêm, việc thêm hoặc xóa bất kỳ trường nào có thể phá vỡ quá trình tuần tự hóa mặc định. Tuy nhiên, điều này có thể được giảm thiểu bằng cách sử dụng định dạng nhị phân tùy chỉnh, nhưng nó vẫn đòi hỏi nhiều nỗ lực để đảm bảo khả năng tương thích ngược. Một ví dụ về cách tuần tự hóa có thể hạn chế khả năng sửa đổi một lớp của bạn là trường SerialVersionUID. Nếu bạn không khai báo rõ ràng SerialVersionUID thì máy ảo sẽ tạo nó dựa trên cấu trúc lớp, điều này phụ thuộc vào các giao diện được lớp triển khai và một số yếu tố khác có thể thay đổi. Giả sử bạn triển khai một giao diện khác thay vì JVM, giao diện này sẽ tạo ra một SerialVersionUID khác cho phiên bản mới của các tệp lớp và khi bạn cố tải một đối tượng cũ được phiên bản cũ của chương trình của bạn tuần tự hóa, bạn sẽ nhận được một Ngoại lệ lớp không hợp lệ. Câu hỏi 1) Sự khác biệt giữa giao diện Serializable và externalizable trong Java là gì? Đây là câu hỏi phỏng vấn tuần tự hóa Java được hỏi thường xuyên nhất. Giao diện Bên ngoài có thể cung cấp cho chúng ta các phương thức writeExternal() và readExternal(), cho phép chúng ta kiểm soát việc tuần tự hóa một cách linh hoạt thay vì dựa vào cơ chế mặc định. Việc triển khai đúng giao diện Bên ngoài có thể cải thiện đáng kể hiệu suất ứng dụng. Câu 2) Serializable có bao nhiêu phương thức? Nếu không có phương thức thì mục đích của giao diện Serializable là gì? Giao diện có thể tuần tự hóa tồn tại trong gói java.io và tạo thành cốt lõi của công cụ tuần tự hóa của Java. Nó không có bất kỳ phương thức nào và còn được gọi là giao diện điểm đánh dấu trong Java. Khi lớp của bạn triển khai giao diện java.io.Serializable, nó sẽ có khả năng tuần tự hóa. Nó đơn giản. Câu 3) SerialVersionUID là gì? Điều gì xảy ra nếu bạn không xác định nó? Một trong những câu hỏi phỏng vấn tuần tự hóa Java yêu thích của tôi. SerialVersionUID là mã định danh được đặt trên một đối tượng khi nó được tuần tự hóa, thường là mã băm của đối tượng. Bạn có thể sử dụng công cụ serialver để lấy serialVersionUID của đối tượng được tuần tự hóa. SerialVersionUID được sử dụng để kiểm soát phiên bản đối tượng. Bạn cũng có thể chỉ định serialVersionUID trong tệp lớp của mình theo cách thủ công. Hậu quả của việc không chỉ định serialVersionUID là nếu bạn thêm hoặc thay đổi bất kỳ trường nào trong một lớp thì lớp đã được tuần tự hóa sẽ không thể phục hồi vì serialVersionUID được tạo cho lớp mới sẽ khác với trường tương tự của đối tượng được tuần tự hóa cũ. Quá trình tuần tự hóa Java dựa vào serialVersionUID chính xác để khôi phục trạng thái của đối tượng được tuần tự hóa và ném ra ngoại lệ java.io.InvalidClassException nếu có sự không khớp. Để tìm hiểu thêm về serialversionuid, hãy xem tại đây . Câu 4) Khi serialize bạn có muốn một số thành viên không được serialize không? Làm thế nào để đạt được điều này? Một câu hỏi phỏng vấn đăng nhiều kỳ thường gặp khác. Đôi khi mọi người cũng hỏi cách sử dụng biến tạm thời, biến tạm thời và biến tĩnh có được tuần tự hóa hay không, v.v., vì vậy nếu bạn không muốn bất kỳ trường nào là một phần của trạng thái của đối tượng, hãy khai báo nó là tĩnh hoặc tạm thời tùy theo theo nhu cầu của bạn và nó sẽ không được đưa vào quy trình tuần tự hóa Java. Câu hỏi 5) Điều gì xảy ra nếu một trong các thành viên của lớp không triển khai giao diện Serializable? Một trong những câu hỏi đơn giản về quá trình tuần tự hóa trong Java. Nếu bạn cố gắng tuần tự hóa một đối tượng của một lớp thực hiện Serializable, nhưng đối tượng đó bao gồm một tham chiếu đến một lớp không Serializable, thì NotSerializableException sẽ được ném ra trong thời gian chạy và đó là lý do tại sao tôi luôn đặt SerializableAlert (phần nhận xét trong phần nhận xét của tôi ) mã số), một trong những kỹ thuật nhận xét mã tốt nhất là hướng dẫn nhà phát triển ghi nhớ thực tế này khi thêm trường mới vào lớp Serializable. Câu 6) Nếu một lớp có khả năng tuần tự hóa nhưng siêu lớp của nó thì không, trạng thái của các biến thể hiện được kế thừa từ siêu lớp sau khi khử tuần tự hóa sẽ như thế nào? Quá trình tuần tự hóa Java chỉ tiếp tục trong hệ thống phân cấp đối tượng miễn là lớp đó triển khai giao diện Serializable và các giá trị của các biến được kế thừa từ siêu lớp sẽ được khởi tạo bằng cách gọi hàm tạo của siêu lớp không tuần tự hóa trong quá trình giải tuần tự hóa. Khi chuỗi hàm tạo đã bắt đầu, không có cách nào để dừng nó, vì vậy ngay cả khi các lớp cao hơn trong hệ thống phân cấp (không) triển khai giao diện Serializable thì hàm tạo sẽ được thực thi. Câu hỏi phỏng vấn tuần tự này có vẻ rất khó nhưng nếu bạn đã quen thuộc với các khái niệm chính thì sẽ không khó. Câu hỏi 7) Bạn có thể tùy chỉnh quy trình tuần tự hóa hoặc ghi đè quy trình tuần tự hóa mặc định trong Java không? Câu trả lời là có, bạn có thể. Tất cả chúng ta đều biết rằng để tuần tự hóa một đối tượng, ObjectOutputStream.writeObject(saveThisObject) được gọi và để đọc một đối tượng, ObjectInputStream.readObject() được gọi, nhưng có một điều nữa mà Máy ảo Java cung cấp cho bạn - xác định hai phương thức này trong lớp của bạn. Nếu bạn định nghĩa chúng trong lớp của mình, JVM sẽ gọi hai phương thức này thay vì sử dụng cơ chế tuần tự hóa mặc định. Tại đây, bạn có thể định cấu hình hành vi tuần tự hóa và giải tuần tự hóa của đối tượng bằng cách thực hiện bất kỳ tác vụ tiền xử lý hoặc hậu xử lý nào. Điều quan trọng cần lưu ý là các phương thức này phải ở chế độ riêng tư để tránh kế thừa, ghi đè hoặc quá tải. Vì chỉ Máy ảo Java mới có thể gọi một phương thức riêng tư nên tính toàn vẹn của lớp của bạn sẽ được giữ nguyên và quá trình tuần tự hóa sẽ hoạt động như bình thường. Theo tôi, đây là một trong những câu hỏi hay nhất có thể được hỏi trong bất kỳ cuộc phỏng vấn Java Serialization nào. Một câu hỏi tiếp theo hay là: tại sao bạn cần cung cấp biểu mẫu tuần tự tùy chỉnh cho đối tượng của mình? Câu 8) Giả sử siêu lớp của một lớp mới triển khai giao diện Serializable, làm thế nào chúng ta có thể tránh việc tuần tự hóa lớp mới? Một trong những câu hỏi phỏng vấn khó về Serialization trong Java. Nếu siêu lớp của một lớp đã triển khai giao diện Serializable trong Java thì lớp con cũng có thể Serializable, vì bạn không thể triển khai giao diện của lớp cha và thực sự không thể biến nó thành lớp Non Serializable. Tuy nhiên, có một cách để tránh việc tuần tự hóa cho lớp mới này. Để làm điều này, bạn cần triển khai các phương thức writeObject() và readObject() và ném NotSerializableException khỏi các phương thức này. Câu hỏi này thường được hỏi như một câu hỏi bổ sung khi cuộc phỏng vấn diễn ra. Câu 9) Các phương thức được sử dụng trong quá trình tuần tự hóa và giải tuần tự hóa trong Java là gì? Đây là một câu hỏi rất phổ biến trong việc tuần tự hóa. Người phỏng vấn đang cố gắng tìm hiểu điều gì trong trường hợp này? Cho dù bạn có quen với việc sử dụng readObject(), writeObject(), readExternal() và writeExternal() hay không. Việc tuần tự hóa Java được thực hiện bởi lớp java.io.ObjectOutputStream. Lớp này là một luồng được lọc được bao quanh luồng byte cấp thấp hơn để xử lý công cụ tuần tự hóa. Để lưu bất kỳ đối tượng nào bằng cơ chế tuần tự hóa, chúng ta gọi ObjectOutputStream.writeObject(saveThisObject) và để giải tuần tự hóa đối tượng đó, chúng ta gọi phương thức ObjectInputStream.readObject(). Việc gọi phương thức writeObject() sẽ bắt đầu quá trình tuần tự hóa. Một điều quan trọng cần lưu ý về phương thức readObject() là nó được sử dụng để đọc byte, tạo và trả về một đối tượng từ các byte đó, do đó các byte này phải được chuyển sang đúng loại. Câu hỏi 10) Giả sử bạn có một lớp mà bạn đã tuần tự hóa và lưu lại, sau đó bạn sửa đổi lớp đó để thêm một trường mới. Điều gì xảy ra nếu bạn giải tuần tự hóa một đối tượng đã được tuần tự hóa? Nó phụ thuộc vào việc lớp có serialVersionUID riêng hay không. Như chúng ta đã biết từ các câu hỏi trên, nếu chúng ta không cung cấp serialVersionUID trong mã của mình, trình biên dịch java sẽ tự tạo ra nó và thông thường nó sẽ bằng mã băm của đối tượng đó. Sau khi thêm bất kỳ trường mới nào, có khả năng serialVersionUID mới được tạo cho phiên bản đó của lớp không khớp với đối tượng đã được tuần tự hóa, trong trường hợp đó API sẽ đưa ra ngoại lệ java.io.InvalidClassException. Vì lý do này, bạn nên có serialVersionUID của riêng mình trong mã, mã này luôn giống nhau cho cùng một lớp. Câu 11) Những thay đổi tương thích và không tương thích trong cơ chế tuần tự hóa Java là gì? Vấn đề thực sự là thay đổi cấu trúc của các lớp bằng cách thêm bất kỳ trường, phương thức nào hoặc xóa bất kỳ trường hoặc phương thức nào có đối tượng đã được tuần tự hóa. Theo đặc tả Java Serialization, việc thêm bất kỳ trường hoặc phương thức nào đều phải tuân theo sự thay đổi tương thích và thay đổi hệ thống phân cấp lớp hoặc một số giao diện Serializable do UN triển khai theo những thay đổi không tương thích). Để có danh sách đầy đủ các thay đổi tương thích và không tương thích, tôi khuyên bạn nên đọc Đặc tả tuần tự hóa Java. Câu 12) Chúng ta có thể truyền một đối tượng được tuần tự hóa qua mạng không? Có, bạn có thể truyền một đối tượng được tuần tự hóa qua mạng vì đối tượng được tuần tự hóa Java là một tập hợp các byte có thể được truyền đi theo bất kỳ cách nào. Bạn cũng có thể lưu trữ đối tượng được tuần tự hóa trên đĩa hoặc trong cơ sở dữ liệu dưới dạng Blob. Câu 13) Những loại biến nào không được tuần tự hóa trong quá trình tuần tự hóa Java? Câu hỏi này đôi khi được hỏi theo những cách khác nhau, nhưng mục tiêu thì giống nhau: tìm hiểu xem liệu nhà phát triển Java có biết chi tiết cụ thể về việc tuần tự hóa các biến tĩnh và tạm thời hay không. Vì các biến tĩnh thuộc về một lớp chứ không phải một đối tượng nên chúng không phải là một phần trạng thái của đối tượng, do đó chúng không được duy trì trong quá trình tuần tự hóa Java. Bởi vì tuần tự hóa Java chỉ lưu trữ trạng thái của một đối tượng chứ không phải chính đối tượng đó, nên các biến tạm thời cũng không được đưa vào quá trình tuần tự hóa và không phải là một phần của trạng thái tuần tự hóa của đối tượng. Sau câu hỏi này, có lẽ người phỏng vấn sẽ hỏi: Nếu không lưu trữ giá trị của các biến này thì giá trị của các biến này sau khi deserializing và tái tạo lại đối tượng này sẽ là bao nhiêu? Và điều này, các đồng nghiệp hãy tự suy nghĩ :) Bài viết gốc ở đây .
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION