【问题标题】: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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2011-12-18
      相关资源
      最近更新 更多