如何在c#中序列化64位枚举

问题描述 投票:3回答:1
[Flags]
Enum xyz : UInt64
{
  a = 1,
  .
  .
  . 
  b = 17179869184,
}  

用于序列化,我正在使用:

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

name = xyz.b;

反序列化时我得到0,所以如何获得64位数字?

c# serialization 64-bit protocol-buffers
1个回答
1
投票

我们需要在这里看两件事。第一个是:只要您分配一个非零值,对于大多数值,它应该已经有效;您看到零的事实告诉我可能首先没有分配值(枚举的默认值是零,即使您不define任何东西值为零),或者您正在使用可倒带的流,但尚未倒回;这适用于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

但是,存在较大的问题,因为protobuf defines枚举为32位。 v3代码库可解决此问题,因此在v3预览中,相同的代码也可以在b下正常工作,但是在v2上,b的值当前太大,会导致算术溢出。在这种情况下,我要使用的是阴影属性:

public xyz name;

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

这将适用于v2或v3。

© www.soinside.com 2019 - 2024. All rights reserved.