diff --git a/src/Discord.Net.Audio/Net/VoiceSocket.cs b/src/Discord.Net.Audio/Net/VoiceSocket.cs index 43ef6c45f..8bc195a33 100644 --- a/src/Discord.Net.Audio/Net/VoiceSocket.cs +++ b/src/Discord.Net.Audio/Net/VoiceSocket.cs @@ -10,6 +10,7 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; +using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; @@ -402,7 +403,11 @@ namespace Discord.Net.WebSockets protected override async Task ProcessMessage(string json) { await base.ProcessMessage(json).ConfigureAwait(false); - var msg = JsonConvert.DeserializeObject(json); + + WebSocketMessage msg; + using (var reader = new JsonTextReader(new StringReader(json))) + msg = _serializer.Deserialize(reader, typeof(WebSocketMessage)) as WebSocketMessage; + var opCode = (OpCodes)msg.Operation; switch (opCode) { diff --git a/src/Discord.Net/Net/Rest/JsonRestClient.cs b/src/Discord.Net/Net/Rest/JsonRestClient.cs index 37bb093ab..5acfdf595 100644 --- a/src/Discord.Net/Net/Rest/JsonRestClient.cs +++ b/src/Discord.Net/Net/Rest/JsonRestClient.cs @@ -1,22 +1,23 @@ using Discord.Logging; using Newtonsoft.Json; +using System.IO; namespace Discord.Net.Rest { public class JsonRestClient : RestClient { - private JsonSerializerSettings _deserializeSettings; + private JsonSerializer _serializer; public JsonRestClient(DiscordConfig config, string baseUrl, Logger logger) : base(config, baseUrl, logger) { - _deserializeSettings = new JsonSerializerSettings(); + _serializer = new JsonSerializer(); #if TEST_RESPONSES - _deserializeSettings.CheckAdditionalContent = true; - _deserializeSettings.MissingMemberHandling = MissingMemberHandling.Error; + _serializer.CheckAdditionalContent = true; + _serializer.MissingMemberHandling = MissingMemberHandling.Error; #else - _deserializeSettings.CheckAdditionalContent = false; - _deserializeSettings.MissingMemberHandling = MissingMemberHandling.Ignore; + _serializer.CheckAdditionalContent = false; + _serializer.MissingMemberHandling = MissingMemberHandling.Ignore; #endif } @@ -31,7 +32,8 @@ namespace Discord.Net.Rest if (string.IsNullOrEmpty(json)) throw new Exception("API check failed: Response is empty."); #endif - return JsonConvert.DeserializeObject(json, _deserializeSettings); + using (var reader = new JsonTextReader(new StringReader(json))) + return (T)_serializer.Deserialize(reader, typeof(T)); } } } diff --git a/src/Discord.Net/Net/WebSockets/GatewaySocket.cs b/src/Discord.Net/Net/WebSockets/GatewaySocket.cs index 1bbe3296d..5ce370b51 100644 --- a/src/Discord.Net/Net/WebSockets/GatewaySocket.cs +++ b/src/Discord.Net/Net/WebSockets/GatewaySocket.cs @@ -7,6 +7,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; +using System.IO; using System.Threading; using System.Threading.Tasks; @@ -103,7 +104,11 @@ namespace Discord.Net.WebSockets protected override async Task ProcessMessage(string json) { base.ProcessMessage(json).GetAwaiter().GetResult(); //This is just a CompletedTask, and we need to avoid asyncs in here - var msg = JsonConvert.DeserializeObject(json); + + WebSocketMessage msg; + using (var reader = new JsonTextReader(new StringReader(json))) + msg = _serializer.Deserialize(reader, typeof(WebSocketMessage)) as WebSocketMessage; + if (msg.Sequence.HasValue) _lastSequence = msg.Sequence.Value;