【问题标题】:How to serialize 64 bit enum in c#如何在 C# 中序列化 64 位枚举
【发布时间】:2020-07-06 02:16:40
【问题描述】:
[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】:
我们需要在这里看到两件不同的事情;第一个是:只要您分配一个非零值,对于大多数值它应该已经工作;
您看到零的事实告诉我您可能首先没有分配值(枚举的默认值为零,即使您没有用零定义任何东西),或者您正在使用可倒带流但尚未倒带;这适用于 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 将枚举定义为 32 位。 v3 代码库解决了这个问题,因此在 v3 预览版中,相同的代码也可以与 b 一起正常工作,但在 v2 上,b 的值当前太大,会导致算术溢出。在这种情况下,我会使用影子属性来解决这个问题:
public xyz name;
[ProtoMember(1)]
private ulong NameSerialized
{
get => (ulong)name;
set => name = (xyz)value;
}
这适用于 v2 或 v3。