Có hai điều khác nhau chúng ta cần xem xét ở đây; đầu tiên là: miễn là bạn đang gán một giá trị khác không, đối với hầu hết các giá trị thì nó sẽ hoạt động; thực tế là bạn đang nhìn thấy số 0 nói với tôi rằng bạn có thể không gán giá trị ở vị trí đầu tiên (giá trị mặc định cho enum bằng 0, ngay cả khi bạn không xác định bất cứ điều gì bằng 0) hoặc bạn đang sử dụng một luồng có thể tua lại nhưng không được tua lại; cái này hoạt động trên 2.4.4:
var obj = new ABC { name = xyz.a };
var ms = new MemoryStream();
Serializer.Serialize(ms, obj);
ms.Position = 0; // rewind
var clone = Serializer.Deserialize<ABC>(ms);
Console.WriteLine(clone.name); // a
Tuy nhiên, có một vấn đề với số lượng lớn hơn, vì protobuf định nghĩa enums là 32 bit. Cơ sở mã v3 hoạt động xung quanh điều này, vì vậy trên các bản xem trước của v3, cùng một mã cũng sẽ hoạt động tốt b
, nhưng trên v2, giá trị của bạn b
hiện quá lớn và nó gây ra tràn số học. Trong kịch bản này, cách tôi sẽ tiếp cận điều này là với một thuộc tính bóng:
public xyz name;
[ProtoMember(1)]
private ulong NameSerialized
{
get => (ulong)name;
set => name = (xyz)value;
}
Điều này sẽ làm việc trên cả v2 hoặc v3.