diff --git a/Src/Newtonsoft.Json.Tests/Bson/BsonReaderTests.cs b/Src/Newtonsoft.Json.Tests/Bson/BsonReaderTests.cs index 41ad69f2..255f7785 100644 --- a/Src/Newtonsoft.Json.Tests/Bson/BsonReaderTests.cs +++ b/Src/Newtonsoft.Json.Tests/Bson/BsonReaderTests.cs @@ -1630,6 +1630,53 @@ namespace Newtonsoft.Json.Tests.Bson Assert.IsTrue(reader.Read()); Assert.IsFalse(reader.Read()); + + JsonSerializer serializer = new JsonSerializer(); + ObjectTestClass b = serializer.Deserialize(new BsonReader(new MemoryStream(bytes))); + Assert.AreEqual(typeof(Guid), b.TheGuid.GetType()); + Assert.AreEqual(g, (Guid)b.TheGuid); + } + + [Test] + public void GuidsShouldBeProperlyDeserialised_AsBytes() + { + Guid g = new Guid("822C0CE6-CC42-4753-A3C3-26F0684A4B88"); + + MemoryStream ms = new MemoryStream(); + BsonWriter writer = new BsonWriter(ms); + writer.WriteStartObject(); + writer.WritePropertyName("TheGuid"); + writer.WriteValue(g); + writer.WriteEndObject(); + writer.Flush(); + + byte[] bytes = ms.ToArray(); + + BsonReader reader = new BsonReader(new MemoryStream(bytes)); + Assert.IsTrue(reader.Read()); + Assert.IsTrue(reader.Read()); + + CollectionAssert.AreEquivalent(g.ToByteArray(), reader.ReadAsBytes()); + Assert.AreEqual(JsonToken.Bytes, reader.TokenType); + Assert.AreEqual(typeof(byte[]), reader.ValueType); + CollectionAssert.AreEquivalent(g.ToByteArray(), (byte[])reader.Value); + + Assert.IsTrue(reader.Read()); + Assert.IsFalse(reader.Read()); + + JsonSerializer serializer = new JsonSerializer(); + BytesTestClass b = serializer.Deserialize(new BsonReader(new MemoryStream(bytes))); + CollectionAssert.AreEquivalent(g.ToByteArray(), b.TheGuid); + } + + public class BytesTestClass + { + public byte[] TheGuid { get; set; } + } + + public class ObjectTestClass + { + public object TheGuid { get; set; } } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json/JsonReader.cs b/Src/Newtonsoft.Json/JsonReader.cs index e7a6c8da..d646339c 100644 --- a/Src/Newtonsoft.Json/JsonReader.cs +++ b/Src/Newtonsoft.Json/JsonReader.cs @@ -513,7 +513,16 @@ namespace Newtonsoft.Json return null; if (t == JsonToken.Bytes) + { + if (ValueType == typeof(Guid)) + { + byte[] data = ((Guid)Value).ToByteArray(); + SetToken(JsonToken.Bytes, data, false); + return data; + } + return (byte[])Value; + } if (t == JsonToken.StartArray) { diff --git a/Src/Newtonsoft.Json/Utilities/ConvertUtils.cs b/Src/Newtonsoft.Json/Utilities/ConvertUtils.cs index 38d2a86a..1316e248 100644 --- a/Src/Newtonsoft.Json/Utilities/ConvertUtils.cs +++ b/Src/Newtonsoft.Json/Utilities/ConvertUtils.cs @@ -440,6 +440,12 @@ namespace Newtonsoft.Json.Utilities return ConvertResult.Success; } + if (initialValue is Guid && targetType == typeof(byte[])) + { + value = ((Guid)initialValue).ToByteArray(); + return ConvertResult.Success; + } + if (initialValue is string) { if (targetType == typeof(Guid))