Como serializar enum de 64 bits em c #

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

para serializar eu estou usando:

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

name = xyz.b;

Estou recebendo 0 na desserialização, então como posso obter o número de 64 bits?

Abbas Tambawala
fonte

Respostas:

4

Há duas coisas diferentes que precisamos examinar aqui; a primeira é: desde que você esteja atribuindo um valor diferente de zero, para a maioria dos valores ele já deve funcionar; o fato de você estar vendo zero me diz que provavelmente não está atribuindo um valor em primeiro lugar (o valor padrão de uma enumeração é zero, mesmo que você não defina nada com zero), ou está usando um fluxo rebobinável, mas não rebobinado; isso funciona na 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

No entanto, há um problema com números maiores, pois o protobuf define as enumerações para serem de 32 bits. A base de código da v3 funciona em torno disso, portanto, nas visualizações da v3, o mesmo código também funcionará bem b, mas na v2 o valor de batualmente é muito grande e causa um estouro aritmético. Nesse cenário, a maneira como eu abordaria isso é com uma propriedade shadow:

public xyz name;

[ProtoMember(1)]
private ulong NameSerialized
{
    get => (ulong)name;
    set => name = (xyz)value;
}

Isso funcionará na v2 ou v3.

Marc Gravell
fonte