Học android các bạn chắc chắn gặp vấn để về 2 loại interface được sử dụng để gửi các đối tượng trong android. Liệu 2 interface này có khác nhau, chúng ta hãy cùng giải quyết vấn đề này.
Các bài viết liên quan:
Tổng quan về Serializable và Parcelable
Serializable và Parcelable là hai giao diện trong Android cho phép đối tượng được chuyển đổi thành dạng có thể truyền qua mạng hoặc lưu trữ vào bộ nhớ. Chúng cung cấp khả năng đóng gói và giải nén đối tượng để truyền dữ liệu giữa các thành phần của ứng dụng hoặc giữa các ứng dụng khác nhau.
- Serializable:
- Serializable là một giao diện đánh dấu, không yêu cầu triển khai bất kỳ phương thức nào.
- Đối tượng được đánh dấu là Serializable có thể được chuyển đổi thành dạng byte để lưu trữ hoặc truyền qua mạng.
- Tuy nhiên, quá trình đóng gói và giải nén đối tượng Serializable có thể tốn nhiều thời gian và tài nguyên, đặc biệt khi xử lý với các đối tượng phức tạp.
- Parcelable:
- Parcelable là một giao diện phải triển khai bởi lớp để cho phép đối tượng có thể đóng gói và giải nén.
- Đối tượng triển khai Parcelable được chuyển đổi thành dạng parcelable, giúp tăng hiệu suất và giảm tài nguyên hơn so với Serializable.
- Để triển khai Parcelable, bạn cần triển khai các phương thức như writeToParcel() và createFromParcel() để đóng gói và giải nén dữ liệu.
Tùy thuộc vào yêu cầu của ứng dụng và đặc điểm của đối tượng, bạn có thể lựa chọn sử dụng Serializable hoặc Parcelable. Serializable đơn giản để triển khai, nhưng hiệu suất có thể bị ảnh hưởng trong các tình huống phức tạp. Parcelable cung cấp hiệu suất tốt hơn, nhưng đòi hỏi công sức triển khai thêm.
Việc chọn giữa Serializable và Parcelable cần xem xét các yếu tố như hiệu suất, độ phức tạp và yêu cầu của ứng dụng để đảm bảo chọn phương pháp tốt nhất để đóng gói và giải nén dữ liệu.
Xem thêm serializable trong java
Sự khác biệt giữa Serializable và Parcelable
Serializable và Parcelable là hai cách khác nhau để đóng gói và giải nén đối tượng trong Android. Dưới đây là một số sự khác biệt quan trọng giữa Serializable và Parcelable:
- Hiệu suất:
- Serializable: Quá trình đóng gói và giải nén đối tượng Serializable có thể tốn nhiều thời gian và tài nguyên. Nó thường chậm hơn và có thể gây tiêu tốn bộ nhớ khi xử lý các đối tượng phức tạp.
- Parcelable: Parcelable được thiết kế để cung cấp hiệu suất tốt hơn. Quá trình đóng gói và giải nén đối tượng Parcelable nhanh chóng hơn và tốn ít tài nguyên hơn so với Serializable.
- Triển khai:
- Serializable: Serializable không đòi hỏi triển khai bất kỳ phương thức nào. Bạn chỉ cần đánh dấu lớp của đối tượng là Serializable.
- Parcelable: Parcelable yêu cầu bạn triển khai các phương thức như writeToParcel() và createFromParcel(). Điều này đòi hỏi thêm công sức và làm cho triển khai Parcelable phức tạp hơn Serializable.
- Tính linh hoạt:
- Serializable: Serializable có khả năng tương thích ngược với các phiên bản Android cũ hơn. Điều này có nghĩa là đối tượng Serializable có thể được truyền giữa các phiên bản Android khác nhau mà không cần điều chỉnh.
- Parcelable: Parcelable là một giao diện đặc thù cho Android, và nó không tương thích ngược với các phiên bản Android cũ hơn. Điều này có nghĩa là nếu bạn muốn truyền đối tượng Parcelable giữa các phiên bản Android khác nhau, bạn cần xử lý sự tương thích phiên bản một cách rõ ràng.
- Tính di động:
- Serializable: Serializable cho phép đối tượng được chuyển qua mạng hoặc lưu trữ trong bộ nhớ.
- Parcelable: Parcelable thường được sử dụng để chuyển đối tượng giữa các thành phần trong cùng một ứng dụng Android, chẳng hạn như giữa các Activity hoặc Fragments.
Tùy thuộc vào yêu cầu và tình huống sử dụng, bạn có thể lựa chọn Serializable hoặc Parcelable để đóng gói và giải nén đối tượng. Nếu hiệu suất và tài nguyên là yếu tố quan trọng, Parcelable thường là sự lựa chọn tốt hơn. Tuy nhiên, nếu tính linh hoạt và tương thích ngược với các phiên bản Android cũ là yêu cầu, Serializable có thể là lựa chọn phù hợp hơn.
Xem thêm Kiến trúc Android (Android Architecture)
Cách sử dụng Serializable trong Android
Để sử dụng Serializable trong Android, bạn cần tuân thủ các bước sau:
Đánh dấu lớp muốn đóng gói Serializable:
public class MySerializableObject implements Serializable { // Các thành viên và phương thức của lớp }
Đóng gói đối tượng Serializable:
MySerializableObject objectToSerialize = new MySerializableObject(); // Thiết lập các giá trị cho đối tượng try { FileOutputStream fileOut = new FileOutputStream("path/to/file.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(objectToSerialize); out.close(); fileOut.close(); System.out.println("Đối tượng đã được đóng gói Serializable và lưu vào file"); } catch (IOException e) { e.printStackTrace(); }
Giải nén đối tượng Serializable:
MySerializableObject deserializedObject = null; try { FileInputStream fileIn = new FileInputStream("path/to/file.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); deserializedObject = (MySerializableObject) in.readObject(); in.close(); fileIn.close(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } // Sử dụng đối tượng đã giải nén if (deserializedObject != null) { // Thao tác với đối tượng đã giải nén }
Lưu ý rằng khi sử dụng Serializable, đảm bảo rằng tất cả các thành viên của lớp bạn muốn đóng gói đều là Serializable hoặc là kiểu dữ liệu nguyên thủy (primitive types) có thể được tuần tự hóa. Nếu lớp có các thành viên không Serializable, bạn cần xem xét việc đánh dấu chúng là transient để tránh lỗi khi đóng gói.
Đồng thời, hãy chắc chắn rằng các file được sử dụng cho đóng gói và giải nén có quyền truy cập và đúng đường dẫn trên thiết bị của bạn.
Xem thêm Cài đặt android studio & SDK
Cách sử dụng Parcelable trong Android
Để sử dụng Parcelable trong Android, bạn cần thực hiện các bước sau:
- Triển khai giao diện Parcelable cho lớp đối tượng muốn đóng gói:
public class MyParcelableObject implements Parcelable { // Các thành viên và phương thức của lớp // Phương thức khởi tạo Parcelable protected MyParcelableObject(Parcel in) { // Đọc dữ liệu từ Parcel vào các thành viên của lớp } // Ghi các thành viên của lớp vào Parcel @Override public void writeToParcel(Parcel dest, int flags) { // Ghi dữ liệu vào Parcel } // Định nghĩa Creator để tạo đối tượng từ Parcel public static final Creator<MyParcelableObject> CREATOR = new Creator<MyParcelableObject>() { @Override public MyParcelableObject createFromParcel(Parcel in) { return new MyParcelableObject(in); } @Override public MyParcelableObject[] newArray(int size) { return new MyParcelableObject[size]; } }; }
- Ghi dữ liệu của đối tượng vào Parcel:
MyParcelableObject objectToParcel = new MyParcelableObject(); // Thiết lập các giá trị cho đối tượng Parcel parcel = Parcel.obtain(); objectToParcel.writeToParcel(parcel, 0);
- Đọc dữ liệu từ Parcel để giải nén đối tượng:
parcel.setDataPosition(0); // Đặt vị trí của Parcel về đầu MyParcelableObject deserializedObject = MyParcelableObject.CREATOR.createFromParcel(parcel); // Sử dụng đối tượng đã giải nén if (deserializedObject != null) { // Thao tác với đối tượng đã giải nén }
Lưu ý rằng khi sử dụng Parcelable, bạn cần chắc chắn rằng thứ tự ghi và đọc dữ liệu trong phương thức writeToParcel() và constructor của lớp Parcelable là giống nhau.
Ngoài ra, khi đối tượng Parcelable có các thành viên là một đối tượng khác, đảm bảo rằng đối tượng con cũng triển khai Parcelable để có thể được ghi và đọc từ Parcel.
Sử dụng Parcelable thường cho hiệu suất tốt hơn so với Serializable, đặc biệt khi làm việc với các đối tượng phức tạp hoặc khi truyền dữ liệu giữa các thành phần trong ứng dụng Android.
Xem thêm Tài liệu tự học android tốt nhất