So serialisieren Sie die 64-Bit-Enumeration in c #

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

Für die Serialisierung verwende ich:

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

name = xyz.b;

Beim Deserialisieren wird 0 angezeigt. Wie kann ich also eine 64-Bit-Nummer erhalten?

Abbas Tambawala
quelle

Antworten:

4

Es gibt zwei verschiedene Dinge, die wir hier betrachten müssen; Das erste ist: Solange Sie einen Wert ungleich Null zuweisen, sollte dieser für die meisten Werte bereits funktionieren. Die Tatsache, dass Sie Null sehen, sagt mir, dass Sie wahrscheinlich entweder gar keinen Wert zuweisen (der Standardwert für eine Aufzählung ist Null, auch wenn Sie nichts mit Null definieren ) oder Sie verwenden ein zurückspulbarer Strom, der jedoch nicht zurückgespult wurde; das funktioniert am 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

Jedoch gibt es ein Problem mit einer größeren Anzahl, wie protobuf definiert enums 32 Bit zu sein. Die v3-Codebasis umgeht dies. In der v3-Vorschau funktioniert derselbe Code auch beinwandfrei. In v2 ist Ihr Wert von bderzeit jedoch zu groß und führt zu einem arithmetischen Überlauf. In diesem Szenario würde ich dies mit einer Schatteneigenschaft angehen:

public xyz name;

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

Dies funktioniert entweder in Version 2 oder Version 3.

Marc Gravell
quelle