Ada banyak cara untuk menangani masalah versi; Anda dapat melakukannya dengan memiliki satu fungsi pemuatan per versi, Anda dapat mencoba mengotomatiskan proses dengan menggambarkan (melalui atribut biasanya) transformasi struktur aset dari waktu ke waktu, Anda dapat melakukan pemeriksaan khusus versi di dalam fungsi pemuatan / penyimpanan, dan lain-lain .
Saya suka pendekatan "jelaskan perubahan" tetapi menemukan bahwa mencoba melakukannya melalui atribut menjadi canggung dengan cepat . Saya akan menggunakan fungsi sebagai gantinya; mengimplementasikan fungsi yang mengubah data dalam versi Nke data dalam versi N + 1untuk semua versi yang sesuai. Saat memuat, periksa versi terhadap yang terbaru dan jika tidak, jalankan data melalui semua fungsi versi yang sesuai. Selalu simpan versi terbaru.
Ini bekerja paling baik jika Anda melakukan transformasi ketika data masih dalam bentuk nilai kunci runtime. Ini berarti Anda mungkin ingin menerapkan representasi untuk data Anda yang merupakan pendekatan "runtime bag of properties", karena Anda tidak dapat menggunakan bentuk nilai kunci yang mendasari JSON atau XML jika Anda memiliki format biner sendiri. Jika Anda tidak melakukan ini, Anda juga mungkin perlu menjaga definisi kelas lama, yang menjadi jelek. Mampu memiliki aset Anda dalam format buruk properti ini juga sangat berguna untuk pengembangan editor game.
Selama pengembangan saat Anda mengulangi data Anda, itu akan secara alami melembung ke versi terbaru dan Anda akhirnya dapat menghapus fungsi versi lama. Ini kurang lebih pendekatan tingkat tinggi yang sama yang kami gunakan untuk menilai aset seni (seperti peta) di Guild Wars 2.
Sekarang, semua yang dikatakan, saya pikir itu berguna untuk mendukung serialisasi teks dan biner untuk aset. Selama pengembangan, simpan semua data Anda dalam format yang dapat dibaca manusia berdasarkan XML atau JSON. Ini dapat meningkatkan kemampuan iterasi Anda banyak karena Anda tidak perlu membuat alat yang rumit seperti saat mengedit data. Anda dapat kembali untuk membuat tweak cepat sederhana dengan tangan.
Kedua, dengan asumsi Anda bahkan masih menginginkan format biner untuk mengirimkan game (yang dapat meningkatkan ukuran file atau waktu IO file, jadi itu keinginan yang sah), rancang API serialisasi dan deserialisasi Anda untuk menangani versi. Versi ini masih berguna dalam konteks pengiriman, karena sebagai titik tertentu Anda mungkin ingin update kapal atau perbaikan bug. Ada beberapa dokumen yang menjelaskan kemampuan versi serialisasi .NET dan serialisasi Boost yang mungkin menarik. Jika Anda sedang akan mendukung kedua teks dan format biner, pastikan Anda menguji mereka kadang-kadang (atau otomatis membangun tes untuk melakukannya, bahkan lebih baik).