Порядковый номер перечисления, влияющий на десериализацию BinaryFormatter?
У меня странная проблема с сериализацией партитур в моей игре.
У меня есть класс LevelHighScore:
[System.Serializable]
public class LevelHighScores
{
readonly Dictionary<Level, ModeScores> scores;
// clipped out the rest for simplicity
}
С ключом enum, Level
,
Недавно я добавил несколько новых уровней в свою игру, но вместо добавления новых уровней в конец перечисления я добавил новые перечисления в алфавитном порядке. Теперь, когда я загружаю игру, мои новые уровни имеют существующие оценки, связанные с ними, заставляя меня думать, что порядковые номера перечислений влияют на сериализацию / десериализацию.
Я хочу избежать этой проблемы при добавлении уровней в будущем. Я также не хочу помнить, чтобы добавить только уровни в конец перечисления.
Есть ли способ обеспечить последовательную десериализацию enum, даже если задним числом добавляются новые значения?
2 ответа
В итоге я последовал совету dbc и добавил явные значения в enum.
Итак, я изменил уровень с,
public enum Level
{
Aquarium,
Crescendo,
HungarianDance,
MapleLeafRag,
}
к
// NOTE: the numbers here don't represent order,
// they are just to ensure proper serialization
public enum Level
{
AmazingPlan = 4, // new level
Aquarium = 0,
Crescendo = 1,
HungarianDance = 2,
MapleLeafRag = 3,
}
Это было хорошее простое решение моей проблемы, хотя я думаю, что для проектов, не связанных с Unity , ответ Скотта Ханнена - это, вероятно, путь.
Добавить [DataContract]
приписать enum и сериализовать, используя DataContractSerializer
, Поместите [EnumMember]
атрибут на отдельные значения.
Это приведет к сериализации значения по имени, а не по числовому значению.
Чтобы убедиться, что я протестирую сериализацию в файл (или строку, если это XML-сериализация) и посмотрю, что он хранит, чтобы убедиться, что он работает, и чтобы он еще не сериализовался по имени. В противном случае вы не будете знать наверняка, в этом ли причина.