Một cách đơn giản để đạt được một ngữ nghĩa của phiên bản là hiểu ý nghĩa của các thành viên của các đối tượng bạn đang tuần tự hóa. Nếu mã của bạn có sự hiểu biết về các loại dữ liệu khác nhau sẽ được tuần tự hóa, bạn có thể có được sự mạnh mẽ mà không phải làm quá nhiều việc.
Giả sử chúng ta có một đối tượng nối tiếp trông như thế này:
ObjectType
{
m_name = "a string"
m_size = { 1.2, 2.1 }
m_someStruct = {
m_deeperInteger = 5
m_radians = 3.14
}
}
Nó sẽ được dễ dàng nhận thấy rằng các loại ObjectType
có thành viên dữ liệu được gọi m_name
, m_size
và m_someStruct
. Nếu bạn có thể lặp lại hoặc liệt kê các thành viên dữ liệu trong thời gian chạy (bằng cách nào đó) thì khi đọc tệp này, bạn có thể đọc tên thành viên và ghép nó với một thành viên thực tế trong thể hiện đối tượng của bạn.
Trong giai đoạn tra cứu này nếu bạn không tìm thấy thành viên dữ liệu phù hợp, bạn có thể bỏ qua phần lưu tệp này một cách an toàn. Ví dụ, phiên bản 1.0 của SomeStruct
đã có m_name
thành viên dữ liệu. Sau đó, bạn vá và thành viên dữ liệu này đã được gỡ bỏ hoàn toàn. Khi tải tập tin lưu của bạn, bạn sẽ đi qua m_name
và tìm kiếm một thành viên phù hợp và không tìm thấy kết quả phù hợp. Mã của bạn có thể chỉ cần chuyển sang thành viên tiếp theo trong tệp mà không gặp sự cố. Điều này cho phép bạn xóa thành viên dữ liệu mà không phải lo lắng về việc phá vỡ các tệp lưu cũ.
Tương tự như vậy nếu bạn thêm một loại thành viên dữ liệu mới và thử tải từ tệp lưu cũ, mã của bạn có thể không khởi tạo thành viên mới. Điều này có thể được sử dụng cho một lợi thế: các thành viên dữ liệu mới có thể chèn vào các tệp lưu trong khi vá thủ công, có thể bằng cách đưa ra các giá trị mặc định (hoặc bằng các phương tiện thông minh hơn).
Định dạng này cũng cho phép các tệp lưu dễ dàng được thao tác hoặc sửa đổi bằng tay; thứ tự mà các thành viên dữ liệu không thực sự có liên quan đến tính hợp lệ của thói quen tuần tự hóa. Mỗi thành viên được tra cứu và khởi tạo độc lập. Đây có thể là một sự tốt đẹp thêm một chút mạnh mẽ.
Tất cả điều này có thể đạt được thông qua một số hình thức hướng nội. Bạn sẽ muốn có thể truy vấn một thành viên dữ liệu bằng cách tra cứu chuỗi và có thể cho biết loại dữ liệu thực sự của thành viên dữ liệu đó là gì. Điều này có thể đạt được trong C ++ bằng cách sử dụng một hình thức hướng nội tùy chỉnh và các ngôn ngữ khác có thể có các phương tiện hướng nội được tích hợp sẵn.