4

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

JObject我已经测试了从(在序列化之前验证JValue.Type == JTokenType.Guid)和匿名类型( )生成 BSON,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

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

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

请注意第二行,它将 the 写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指示二进制的类型
  • 一个四字节的int(值为16,二进制数据的长度)
  • \0x04表示UUID的子类型
  • 16 个字节来表示Guid/UUID 的内容。

这显然是一个错误,我已经在 J​​son.NET 的问题跟踪器中为此提交了一个错误

于 2012-12-18T13:43:43.273 回答