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();
答案 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
表示二进制文件的类型\0x04
表示UUID Guid
/ UUID。这显然是一个错误,I've filed a bug for this in the issue tracker for Json.NET。