Câu trả lời của bác sĩ ABT tốt hơn câu trả lời đã chọn. Có, có giá trị trong quyền hạn của 2 là cần thiết, nhưng đó không phải là cụ thể cho các vấn đề XML serialization.
Enums được tuần tự hóa rất khác so với hầu hết các đối tượng. Enums sẽ được XML Serialized theo tên của chúng (ser(MyEnumProperty.[Name]) = "[Name]"
) thay vì sử dụng giá trị của tên (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;
Nếu bạn đã serialize MyEnumProperty
, bạn sẽ nhận được <MyEnum>
All
</MyEnum>
. Tuy nhiên, nếu bạn đã tuần tự hóa (int)MyEnumProperty
, bạn sẽ nhận được <int>
3
</int>
. Tôi muốn đề cập đến lý do tại sao điều này là cực kỳ cần thiết để biết ...
// Version 2.0
[Flags]
public enum MyEnum
{
None = 0,
First = 1,
Second = 2,
Third = 4, // <---
All = First | Second | Third
}
Tôi đã thêm giá trị Enum mới, có thể đã được sử dụng (dưới dạng DLL) trong các dự án khác. Oh wow ... những lỗi này là gì?
Bạn không còn có thể deserialize phiên bản mới nhất của enum thành phiên bản cũ hơn với XML Serialization (Binary Serialization vẫn hoạt động)!
Hãy xem phương pháp ToEnum của Microsoft. Điều này ngăn chặn một ID (nói, "thứ ba" trong enum cập nhật) từ được xem xét bởi vì nó không tồn tại trong enum ban đầu. Cũng lưu ý rằng một lỗi sẽ được ném mà có thể phá vỡ dự án của bạn nếu nó không được xử lý.
Hãy an toàn, luôn luôn tuần tự hóa và deserialize theo giá trị khi có cơ hội. Đây là lý do tại sao chúng tôi sử dụng các đối tượng như các enum được gắn cờ để bắt đầu. Các đối tượng như enum được gắn cờ làm giảm các vấn đề tương thích và phụ thuộc ngược.
Ok nó hoạt động nhưng bình thường tôi nhận được email dân sự hai giá trị của tôi có khoảng trống giữa? –
+1 để đơn giản và tham khảo MSDN. Mặc dù tỷ lệ upvotes 11: 1 từ câu trả lời của bạn là một chút nhiều! Không bao giờ;) –
@ Dr.AndrewBurnett-Thompson: Đồng ý. Lý do cho điều này có thể là bạn đặt trọng tâm của bạn vào phần tuần tự hóa và chỉ sau đó đã thêm phần giải quyết vấn đề cơ bản. –