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

标签 c# serialization 64-bit protocol-buffers

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

用于序列化我正在使用:
[ProtoContract]
class ABC
{
  [ProtoMember(1)]
  public xyz name;
}

name = xyz.b;

我在反序列化时得到 0,那么我怎样才能得到 64 位数字?

最佳答案

这里我们需要看两件不同的事情;第一个是:只要您分配一个非零值,对于大多数值,它应该已经可以工作;
您看到零的事实告诉我,您可能没有首先分配值(枚举的默认值为零,即使您没有定义任何零值),或者您正在使用可倒带但尚未倒带的流;这适用于 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当前太大,会导致算术溢出。在这种情况下,我将采用的方法是使用 shadow 属性:

public xyz name;

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

这适用于 v2 或 v3。

关于c# - 如何在c#中序列化64位枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60850469/

相关文章:

c# - Visual Studio 2012 构建失败但错误列表中没有错误

c# - 写入httpResponse时,响应是否有大小限制?

.net - 如何在不创建大缓冲区的情况下将大型 .NET 对象图序列化为 SQL Server BLOB?

Delphi 与 Windows 2008 Server 64 位的兼容性

c++ - Tesseract-OCR 在 x64 上使用 visual studio 2015 构建

performance - 巨大的页面缓冲区与多个同时进程

c# - 在 3D 地形上,给定一条 3D 线,找到线和地形之间的交点

c# - 用sqlite和winrt编译报错

c# - 消息协定转换为 SOAP 消息

serialization - logstash 配置文件的格式是什么