Istnieje wiele sposobów radzenia sobie z problemem wersji; możesz to zrobić, mając jedną funkcję ładowania na wersję, możesz spróbować zautomatyzować proces, opisując (zwykle za pomocą atrybutów) transformację struktury zasobów w czasie, możesz przeprowadzać kontrole specyficzne dla wersji w funkcjach ładowania / zapisywania itp. .
Podoba mi się podejście „opisz zmiany”, ale stwierdzenie, że próba zrobienia tego za pomocą atrybutów staje się niezręczne szybko . Zamiast tego użyłbym funkcji; zaimplementuj funkcję, która przekształca dane w wersji N
na dane w wersji N + 1
dla wszystkich odpowiednich wersji. Po załadowaniu sprawdź wersję pod kątem najnowszej wersji, a jeśli nie jest, uruchom dane przez wszystkie odpowiednie funkcje kontroli wersji. Zawsze zapisuj najnowszą wersję.
Działa to najlepiej, jeśli wykonujesz transformację, gdy dane są nadal w postaci klucz-wartość środowiska wykonawczego. Oznacza to, że prawdopodobnie będziesz chciał zaimplementować reprezentację dla swoich danych, która jest podejściem „zestawu właściwości środowiska wykonawczego”, ponieważ nie możesz użyć podstawowej formy klucz-wartość JSON lub XML, jeśli masz swój własny format binarny. Jeśli tego nie zrobisz, być może będziesz musiał zachować stare definicje klas, co staje się brzydkie. Możliwość posiadania zasobów w złym formacie tej właściwości jest również niezwykle przydatna przy tworzeniu edytora gier.
Podczas programowania podczas iteracji twoich danych naturalnie pojawi się bąbelek do najnowszej wersji i ostatecznie możesz usunąć stare funkcje wersjonowania. Jest to mniej więcej to samo podejście wysokiego poziomu, którego użyliśmy do wersjonowania zasobów graficznych (takich jak mapy) w Guild Wars 2.
Teraz to wszystko powiedziawszy, myślę, że warto obsługiwać zarówno serializację tekstową, jak i binarną dla zasobów. Podczas programowania przechowuj wszystkie dane w formacie czytelnym dla człowieka na podstawie XML lub JSON. Może to znacznie zwiększyć twoją zdolność do iteracji, ponieważ nie musisz budować tak złożonych narzędzi do edycji danych. Możesz wrócić do możliwości ręcznego wprowadzania prostych poprawek.
Po drugie, zakładając, że nadal potrzebujesz formatu binarnego do wysyłki gry (który może poprawić rozmiar pliku lub czasy operacji we / wy pliku, więc jest to słuszne pragnienie), zaprojektuj interfejsy API serializacji i deserializacji do obsługi wersji. Przechowywanie wersji jest nadal przydatne w kontekście wysyłki, ponieważ w pewnym momencie możesz chcieć wysłać aktualizacje lub poprawki błędów. Istnieje kilka dokumentów opisujących możliwości wersjonowania serializacji .NET i serializacji Boost, które mogą Cię zainteresować. Jeśli są zamiar obsługiwać zarówno tekst jak i formaty binarne, upewnij się przetestować je od czasu do czasu (lub zbudować zautomatyzowanych testów, aby to zrobić, nawet lepiej).