Giới thiệu Serial: cải thiện data Serialization trong Android
Scroll timeline mượt mà trên ứng dụng Twitter dành cho Android rất quan trọng đối với trải nghiệm người dùng. Với một số profile, serializing và deserializing dữ liệu từ cơ sở dữ liệu sử dụng các class Externalizable chuẩn của Android đã chiếm khoảng 15% thời gian xử lý UI. Các thư viện hiện tại ...
Scroll timeline mượt mà trên ứng dụng Twitter dành cho Android rất quan trọng đối với trải nghiệm người dùng. Với một số profile, serializing và deserializing dữ liệu từ cơ sở dữ liệu sử dụng các class Externalizable chuẩn của Android đã chiếm khoảng 15% thời gian xử lý UI. Các thư viện hiện tại cung cấp ít hỗ trợ cho việc thực hiện những thay đổi lặp đi lặp lại, và bất kỳ thay đổi nào sẽ phá vỡ serialization gây ra lỗi khó xác định và khắc phục nếu bạn không xóa sạch cơ sở dữ liệu.
Chúng ta sẽ tìm hiểu các lợi thế của thư viện Serial sau đây.
1. Performance
Với Externalizableable, thông tin về class, bao gồm cả tên class và package, được thêm vào mảng byte khi serializing đối tượng. Điều này cho phép framework xác định đối tượng nào cần serialized và nơi để tìm thấy lớp trong cấu trúc package của ứng dụng, nhưng đó là một quá trình tốn thời gian.
Để loại bỏ sự không hiệu quả này, Serial cho phép developer xác định một Serializer cho mỗi đối tượng cần serialized. Serializer có thể liệt kê rõ ràng cách mỗi trường nên được ghi vào và đọc từ luồng tuần tự. Điều này loại bỏ sự cần thiết phải có sự phản chiếu và dynamic lookups.
Ngoài ra, Serializers không có state và có thể được sử dụng trực tiếp như trường hợp tĩnh.
Trong một testcase với một đối tượng TweetEntities lớn, chúng ta sẽ thấy những cải tiến đáng kể về kích thước và tốc độ serialization và deserialization trung bình.
Như đã trình bày trong bảng kết quả trên, serialization nhanh hơn 3 lần, với serialization nhanh hơn gần 5 lần và deserialization nhanh hơn khoảng 2,5 lần (deserialization chậm hơn vì thời gian tạo ra một thể hiện mới của đối tượng). Không gian dành để sắp đặt từng hàng đối tượng này đã giảm gần 5 lần. Những cải tiến này sẽ thay đổi dựa trên đối tượng được tuần tự, nhưng lợi ích là đáng kể.
2. Debuggability
Để cải thiện khả năng gỡ lỗi của serialization, chúng ta sẽ lợi dụng cấu trúc của serializer để cung cấp các thông báo lỗi có mô tả và ý nghĩa. Phần lớn các vấn đề xảy ra khi deserialization tìm thấy một giá trị bất thường trong đầu vào, hoặc vì một cái gì đó đã thay đổi kể từ khi đối tượng được tuần tự hoặc có một lỗi trong mã serialization. Khi một vấn đề xảy ra, Serial cung cấp một ngoại lệ với chính xác giá trị bất thường, và một dump của cấu trúc của dữ liệu được serialized để cho phép các developer xem vị trí đối tượng vấn đề xảy ra. Điều này giúp các developer dễ dàng xác định và khắc phục sự cố.
3. Backwards compatibility
Trong quá khứ, nếu một developer muốn thay đổi model object, nó đã phá vỡ serialization và thường đòi hỏi một cơ sở dữ liệu sạch sẽ. Để khắc phục sự cố này và cho phép các developer thực hiện thay đổi nhanh chóng và không có chi phí bổ sung, chúng ta đã thêm phiên bản. Nếu một field được thêm vào hoặc gỡ bỏ, bạn có thể tăng version của Serializer. Version này được ghi vào dữ liệu được tuần tự để trong quá trình deserialization, version được đọc và có thể được sử dụng trong mã deserialization để xác định chính xác những gì các trường được mong đợi cho version đó.
Ngoài ra, bất kỳ tham chiếu nào liên quan đến tên lớp hoặc gói đã được xóa khỏi dữ liệu serialized . Không giống như các thư viện Android, nơi mà nếu bạn di chuyển class hoặc thay đổi tên serialization sẽ bị phá vỡ, Serial làm cho nó dễ dàng cho các developer để thay đổi codebase mà không có những hậu quả này.
4. Flexibility
Để làm cho Serial dễ dàng sử dụng, điều quan trọng là không đòi hỏi những thay đổi đáng kể đối với cấu trúc mô hình hiện tại. Kể từ khi một Serializer được định nghĩa như là một lớp độc lập mà có thể được gọi là tĩnh để serialize một đối tượng, hầu như bất kỳ đối tượng mô hình có thể được serialized bằng cách sử dụng framework này. Sử dụng Serializer để tuần tự hóa một đối tượng, chỉ cần tạo một thể hiện của class Serial, cho phép chúng ta chuyển một đối tượng sang một mảng byte bằng cách sử dụng Serializer được xác định.