C#で64ビット列挙型をシリアル化する方法


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

私が使用しているシリアル化のために:

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

name = xyz.b;

逆シリアル化で0を取得していますが、64ビットの数値を取得するにはどうすればよいですか?

回答:


4

ここでは、2つの異なる点に注意する必要があります。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のいずれでも機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.