2

Int64として0のエンコーディングに問題があるようです。Int64okとしての他の値。

[ProtoMember(3)] private readonly Int64 _intValue

Int64.MinValueとして逆シリアル化されます

何か案が?

バグを確認します。_val == 0の場合、このクラスは正しくシリアル化されません

[ProtoContract]

class VerySimple
{
    [ProtoMember(1)]
    private readonly Int64 _val = Int64.MinValue;

    public VerySimple(long val)
    {
        _val = val;
    }

    public long Val
    {
        get { return _val; }            
    }

    public VerySimple()
    {
    }
}

このテストは失敗します

[テスト]

    public void TestProtobufEncodingSimple()
    {
        //OK
        {
            MemoryStream stream = new MemoryStream();
            Serializer.Serialize(stream, new VerySimple(1));
            stream.Seek(0, SeekOrigin.Begin);
            VerySimple reloaded = Serializer.Deserialize<VerySimple>(stream);
            Assert.AreEqual(reloaded.Val, 1L);
        }

        //KO
        {
            MemoryStream stream = new MemoryStream();
            Serializer.Serialize(stream, new VerySimple(0));
            stream.Seek(0, SeekOrigin.Begin);
            VerySimple reloaded = Serializer.Deserialize<VerySimple>(stream);
            Assert.AreEqual(reloaded.Val, 0L);
        }
    }
4

1 に答える 1

1

遅れてすみません - 数日間オフラインでした ;-p

プロトコル バッファの仕様には、ほとんどの型で暗黙のデフォルト ゼロがあります。準拠した処理を保証するために、特に指定しない限り、このデフォルトが尊重されます。ドキュメントでこれをより明確にしようとします。

いくつかの解決策があります。

  • [DefaultValue(int.MinValue)]フィールドに属性を追加して、明示的なデフォルトを設定します
  • 属性IsRequired = trueに追加[ProtoMember]
  • を使用するNullable<int>と、ゼロを明示的に扱うと思われます
  • ShouldSerialize*プロパティの場合、パターンを尊重するため、Valプロパティ (セッターを含む) が を持っている[ProtoMember]場合は、bool ShouldSerializeVal()
于 2009-09-07T19:55:33.197 に答える