如何使用JSON.NET将GUID序列化为BSON中的本机UUID

时间:2012-12-18 08:39:12

标签: .net json.net bson

JSON.NET似乎不希望将GUID序列化为本机BSON UUID,而是将GUID作为字符串输出。

我已经测试过从JObject(在序列化之前验证JValue.Type == JTokenType.Guid)和匿名类型(new { myUuid = new Guid() })生成BSON,在任何一种情况下都没有运气。

如何强制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();

1 个答案:

答案 0 :(得分:3)

问题来自WriteValue(版本4.5.0.0)中BsonWriter的实现:

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

注意第二行,它将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开始的字节是(根据spec):

  • \0x05表示二进制文件的类型
  • 四字节int(值为16,二进制数据的长度)
  • \0x04表示UUID
  • 的子类型
  • 16个字节,表示Guid / UUID。
  • 的内容

这显然是一个错误,I've filed a bug for this in the issue tracker for Json.NET