4

JSON.NET は、GUID をネイティブ BSON UUID としてシリアル化することを望まないようで、代わりに GUID を文字列として出力しています。

私は両方から BSON を生成することをテストしましたJObject(シリアライゼーション前の確認JValue.Type == JTokenType.Guid)、および匿名型 ( new { myUuid = new Guid() }) どちらの場合もうまくいきませんでした。

JSON.NET で GUID をネイティブ BSON UUID (16 バイトのバイナリ値、サブタイプ = 0x04) としてシリアル化するにはどうすればよいですか?

サンプルコード:

var source = new
{
    myInteger = 123L,
    myFloat = 10.0f,
    myString = "hello",
    myUuid = Guid.NewGuid(),
    myBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7 },
    myDatetime = DateTime.UtcNow,
};

MemoryStream buffer = new MemoryStream();
BsonWriter writer = new BsonWriter(buffer);
JsonSerializer serializer = new JsonSerializer();
serializer.Serialize(writer, source);
byte[] myBson = buffer.ToArray();
4

1 に答える 1

3

この問題はWriteValueBsonWriter(バージョン 4.5.0.0 で)の次の実装に起因します。

public override void WriteValue(Guid value)
{
  base.WriteValue(value);
  this.AddToken((BsonToken) new BsonString((object) value.ToString(), true));
}

2 行目に注意してくださいGuid。これは文字列として記述しているため、結果が表示されます。

次の例を使用します。

[TestMethod]
public void TestMethod1()
{
    var source = new
    {
        myUuid = Guid.NewGuid(),
    };

    using (var buffer = new MemoryStream())
    using (var writer = new BsonWriter(buffer))
    {
        var serializer = new JsonSerializer();
        serializer.Serialize(writer, source);
        byte[] myBson = buffer.ToArray();
    }
}

インデックス12から始まるバイトは(仕様に従って)次のようになると思います:

  • \0x05バイナリの種類を示す
  • 4 バイトの int (値は 16、バイナリ データの長さ)
  • \0x04UUIDのサブタイプを示す
  • Guid/UUIDの内容を表す 16 バイト。

これは明らかにバグであり、Json.NET の課題トラッカーにバグを登録しました

于 2012-12-18T13:43:43.273 に答える