Dr.Ответ АБТ лучше, чем выбранный ответ.Да, иметь значения в степени 2 необходимо, но это не относится к проблемам сериализации XML.
Перечисления сериализуются совсем иначе, чем большинство объектов.Перечисления будут XML-сериализованными по их имени (ser(MyEnumProperty.[Name]) = "[Name]"
) вместо использования имени (ser(MyEnumProperty.[Name]) = 8
).
// Version 1.0
[Flags]
public enum MyEnum
{
None = 0,
First = 1,
Second = 2,
All = First | Second
}
public MyEnum MyEnumProperty = MyEnum.All;
Если бы вы сериализовали MyEnumProperty
, вы бы получили <MyEnum>
All
</MyEnum>
.Однако, если вы сериализовали (int)MyEnumProperty
, вы получите <int>
3
</int>
.Я хотел бы упомянуть, почему это невероятно необходимо знать ...
// Version 2.0
[Flags]
public enum MyEnum
{
None = 0,
First = 1,
Second = 2,
Third = 4, // <---
All = First | Second | Third
}
Я добавил новые значения Enum, которые могли бы использоваться (как DLL) в других проектах.Ух ты ... что это за ошибки?
Вы больше не можете десериализовать вашу новейшую версию enum в более старую версию с XML-сериализацией ( Binary Serialization все еще должна работать)!
Взгляните на метод ToEnum от Microsoft.Это предотвращает просмотр идентификатора (скажем, «Третий» в обновленном перечислении), поскольку он не существует в исходном перечислении.Также обратите внимание, что будет выдано сообщение об ошибке, которое может нарушить ваш проект, если он не будет обработан.
Будьте осторожны, всегда сериализуйте и десериализуйте по значению, когда есть такая возможность.Вот почему для начала мы используем такие объекты, как помеченные перечисления.Такие объекты, как помеченные перечисления, уменьшают проблемы обратной совместимости и зависимости.