Có rất nhiều cách để xử lý vấn đề phiên bản; bạn có thể thực hiện bằng cách có một chức năng tải cho mỗi phiên bản, bạn có thể cố gắng tự động hóa quy trình bằng cách mô tả (thông qua các thuộc tính thường) chuyển đổi cấu trúc tài sản theo thời gian, bạn có thể thực hiện kiểm tra cụ thể theo phiên bản bên trong chức năng tải / lưu, et cetera .
Tôi thích cách tiếp cận "mô tả các thay đổi" nhưng thấy rằng cố gắng thực hiện nó thông qua các thuộc tính trở nên khó xử nhanh chóng . Tôi sẽ sử dụng các chức năng thay thế; thực hiện chức năng biến đổi dữ liệu trong phiên bản N
thành dữ liệu trong phiên bản N + 1
cho tất cả phiên bản phù hợp của bạn. Khi tải, hãy kiểm tra phiên bản mới nhất và nếu không, hãy chạy dữ liệu thông qua tất cả các chức năng tạo phiên bản phù hợp. Luôn luôn lưu phiên bản mới nhất.
Điều này hoạt động tốt nhất nếu bạn thực hiện chuyển đổi khi dữ liệu vẫn ở dạng khóa-giá trị thời gian chạy. Điều này có nghĩa là bạn có thể muốn triển khai biểu diễn cho dữ liệu của mình theo cách tiếp cận "túi thuộc tính thời gian chạy", bởi vì bạn không thể sử dụng dạng JSON hoặc XML cơ bản dưới dạng khóa nếu bạn có định dạng nhị phân của riêng mình. Nếu bạn không làm điều này, bạn cũng có thể cần phải giữ các định nghĩa lớp cũ xung quanh, điều này trở nên xấu xí. Có thể có tài sản của bạn ở định dạng xấu này cũng rất hữu ích cho việc phát triển trình chỉnh sửa trò chơi.
Trong quá trình phát triển khi bạn lặp lại dữ liệu của mình, nó sẽ tự nhiên nổi lên phiên bản mới nhất và cuối cùng bạn có thể xóa các chức năng tạo phiên bản cũ. Đây ít nhiều là cách tiếp cận cấp cao tương tự mà chúng tôi đã sử dụng để phiên bản các tài sản nghệ thuật (như bản đồ) trong Guild Wars 2.
Bây giờ, tất cả những gì đã nói, tôi nghĩ thật hữu ích khi hỗ trợ cả tuần tự văn bản và nhị phân cho tài sản. Trong quá trình phát triển, hãy giữ tất cả dữ liệu của bạn ở định dạng có thể đọc được dựa trên XML hoặc JSON. Điều này có thể tăng khả năng lặp lại của bạn rất nhiều vì bạn không cần phải xây dựng các công cụ phức tạp như vậy xung quanh việc chỉnh sửa dữ liệu. Bạn có thể quay lại để có thể thực hiện các điều chỉnh nhanh đơn giản bằng tay.
Thứ hai, giả sử bạn thậm chí vẫn muốn định dạng nhị phân để vận chuyển trò chơi (có thể cải thiện kích thước tệp hoặc thời gian IO của tệp, vì vậy đó là mong muốn hợp lệ), thiết kế API tuần tự hóa và khử tuần tự hóa của bạn để xử lý phiên bản. Versioning là vẫn còn hữu ích trong bối cảnh vận chuyển, bởi vì như một lúc nào đó bạn có thể muốn cập nhật tàu hoặc sửa lỗi. Có một số tài liệu mô tả các khả năng phiên bản của tuần tự hóa .NET và tuần tự hóa Boost mà bạn có thể thấy thú vị. Nếu bạn đang đi để hỗ trợ cả hai văn bản và định dạng nhị phân, chắc chắn rằng bạn kiểm tra chúng thường xuyên (hoặc tự động xây dựng các xét nghiệm để làm như vậy, thậm chí tốt hơn).