Cách xâu chuỗi enum 64 bit trong c #


8
[Flags]
Enum xyz : UInt64
{
  a = 1,
  .
  .
  . 
  b = 17179869184,
}  

để tuần tự hóa tôi đang sử dụng:

[ProtoContract]
class ABC
{
  [ProtoMember(1)]
  public xyz name;
}

name = xyz.b;

Tôi đang nhận được 0 về khử lưu huỳnh, vậy làm thế nào tôi có thể nhận được số 64 bit?

Câu trả lời:


4

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 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 bhiệ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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.