ByteArrayConverter.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. namespace SocketIOClient.Newtonsoft.Json
  6. {
  7. class ByteArrayConverter : JsonConverter
  8. {
  9. public ByteArrayConverter()
  10. {
  11. Bytes = new List<byte[]>();
  12. }
  13. internal List<byte[]> Bytes { get; }
  14. public override bool CanConvert(Type objectType)
  15. {
  16. return objectType == typeof(byte[]);
  17. }
  18. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, global::Newtonsoft.Json.JsonSerializer serializer)
  19. {
  20. byte[] bytes = null;
  21. if (reader.TokenType == JsonToken.StartObject)
  22. {
  23. reader.Read();
  24. if (reader.TokenType == JsonToken.PropertyName && reader.Value?.ToString() == "_placeholder")
  25. {
  26. reader.Read();
  27. if (reader.TokenType == JsonToken.Boolean && (bool)reader.Value)
  28. {
  29. reader.Read();
  30. if (reader.TokenType == JsonToken.PropertyName && reader.Value?.ToString() == "num")
  31. {
  32. reader.Read();
  33. if (reader.Value != null)
  34. {
  35. if (int.TryParse(reader.Value.ToString(), out int num))
  36. {
  37. bytes = Bytes[num];
  38. reader.Read();
  39. }
  40. }
  41. }
  42. }
  43. }
  44. }
  45. return bytes;
  46. }
  47. public override void WriteJson(JsonWriter writer, object value, global::Newtonsoft.Json.JsonSerializer serializer)
  48. {
  49. var source = value as byte[];
  50. Bytes.Add(source.ToArray());
  51. writer.WriteStartObject();
  52. writer.WritePropertyName("_placeholder");
  53. writer.WriteValue(true);
  54. writer.WritePropertyName("num");
  55. writer.WriteValue(Bytes.Count - 1);
  56. writer.WriteEndObject();
  57. }
  58. }
  59. }