protected T DeserializeUsingNewtonsoftReader <T>(byte[] bson, bool mustBeNested = false) { using (var memoryStream = new MemoryStream(bson)) using (var newtonsoftReader = new Newtonsoft.Json.Bson.BsonDataReader(memoryStream)) { newtonsoftReader.DateTimeKindHandling = System.DateTimeKind.Utc; newtonsoftReader.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc; if (mustBeNested) { newtonsoftReader.Read(); // StartObject newtonsoftReader.Read(); // PropertyName } newtonsoftReader.Read(); // Json.NET serializers expect caller to have already called Read var newtonsoftSerializer = new Newtonsoft.Json.JsonSerializer(); var value = newtonsoftSerializer.Deserialize <T>(newtonsoftReader); if (mustBeNested) { newtonsoftReader.Read(); // EndObject } return(value); } }
/// <summary> /// Builds a tcp messages from a wrapped data array /// used by the tcp processing system to deserialize recieved data /// </summary> /// <param name="data">The wrapped memory array.</param> /// <returns>a new tcp message built from the array segment</returns> /// <exception cref="UnregisteredMessageException"> If the message type is not found this will throw UnregisteredMessageException</exception> public static TcpMessage FromArraySegment(ArraySegment <byte> data) { if (data.Array == null || data.Count < sizeof(int)) { throw new ArgumentException($"ArraySegment null or too short, length: {data.Count}", nameof(data)); } Message msg; #pragma warning disable 618 using (var reader = new BsonDataReader(new MemoryStream(data.Array))) #pragma warning restore 618 { reader.Read(); //object reader.Read(); //property name var messageType = MessageHierarchy.GetTypeByFullName((string)reader.Value); reader.Read(); //property value msg = (Message)JsonConvert.DeserializeObject((string)reader.Value, messageType, Settings.JsonSettings); } Log.Debug("Deserialized Message MsgId=" + msg.MsgId + " MsgType" + msg.GetType().Name); return(new TcpMessage(msg, data)); }