Cómo serializar una enumeración de 64 bits en c #

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

para serializar estoy usando:

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

name = xyz.b;

Estoy obteniendo 0 en la deserialización, entonces, ¿cómo puedo obtener un número de 64 bits?

Abbas Tambawala
fuente

Respuestas:

4

Hay dos cosas diferentes que debemos observar aquí; el primero es: siempre que esté asignando un valor distinto de cero, para la mayoría de los valores ya debería funcionar; el hecho de que esté viendo cero me dice que probablemente no está asignando un valor en primer lugar (el valor predeterminado para una enumeración es cero, incluso si no define nada con cero), o está utilizando un flujo rebobinable pero no rebobinado; esto funciona en 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

Sin embargo, hay un problema con números más grandes, ya que protobuf define las enumeraciones como 32 bits. La base de código v3 funciona alrededor de esto, por lo que en las vistas previas de v3, el mismo código también funcionará bien b, pero en v2 su valor de bactualmente es demasiado grande y causa un desbordamiento aritmético. En este escenario, la forma en que abordaría esto es con una propiedad de sombra:

public xyz name;

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

Esto funcionará en v2 o v3.

Marc Gravell
fuente