BaseSerializationHandler.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using MediaBrowser.Common.Serialization;
  2. using System;
  3. using System.IO;
  4. using System.Threading.Tasks;
  5. namespace MediaBrowser.Common.Net.Handlers
  6. {
  7. public abstract class BaseSerializationHandler<T> : BaseHandler
  8. where T : class
  9. {
  10. public SerializationFormat SerializationFormat
  11. {
  12. get
  13. {
  14. string format = QueryString["dataformat"];
  15. if (string.IsNullOrEmpty(format))
  16. {
  17. return SerializationFormat.Json;
  18. }
  19. return (SerializationFormat)Enum.Parse(typeof(SerializationFormat), format, true);
  20. }
  21. }
  22. protected string ContentType
  23. {
  24. get
  25. {
  26. switch (SerializationFormat)
  27. {
  28. case SerializationFormat.Jsv:
  29. return "text/plain";
  30. case SerializationFormat.Protobuf:
  31. return "application/x-protobuf";
  32. default:
  33. return MimeTypes.JsonMimeType;
  34. }
  35. }
  36. }
  37. protected override async Task<ResponseInfo> GetResponseInfo()
  38. {
  39. ResponseInfo info = new ResponseInfo
  40. {
  41. ContentType = ContentType
  42. };
  43. _objectToSerialize = await GetObjectToSerialize().ConfigureAwait(false);
  44. if (_objectToSerialize == null)
  45. {
  46. info.StatusCode = 404;
  47. }
  48. return info;
  49. }
  50. private T _objectToSerialize;
  51. protected abstract Task<T> GetObjectToSerialize();
  52. protected override Task WriteResponseToOutputStream(Stream stream)
  53. {
  54. return Task.Run(() =>
  55. {
  56. switch (SerializationFormat)
  57. {
  58. case SerializationFormat.Jsv:
  59. JsvSerializer.SerializeToStream(_objectToSerialize, stream);
  60. break;
  61. case SerializationFormat.Protobuf:
  62. ProtobufSerializer.SerializeToStream(_objectToSerialize, stream);
  63. break;
  64. default:
  65. JsonSerializer.SerializeToStream(_objectToSerialize, stream);
  66. break;
  67. }
  68. });
  69. }
  70. }
  71. public enum SerializationFormat
  72. {
  73. Json,
  74. Jsv,
  75. Protobuf
  76. }
  77. }