AbpCacheData.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using Abp.Json;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Reflection;
  6. using System.Text;
  7. namespace Abp.Runtime.Caching
  8. {
  9. /// <summary>
  10. /// A class to hold the Type information and Serialized payload for data stored in the cache.
  11. /// </summary>
  12. public class AbpCacheData
  13. {
  14. private static readonly IReadOnlyList<string> SystemAssemblyNames = new List<string> { "mscorlib", "System.Private.CoreLib" };
  15. public AbpCacheData(
  16. string type, string payload)
  17. {
  18. Type = type;
  19. Payload = payload;
  20. }
  21. public string Payload { get; set; }
  22. public string Type { get; set; }
  23. public static AbpCacheData Deserialize(string serializedCacheData) => serializedCacheData.FromJsonString<AbpCacheData>();
  24. public static AbpCacheData Serialize(object obj)
  25. {
  26. return new AbpCacheData(
  27. SerializeType(obj.GetType()).ToString(),
  28. obj.ToJsonString());
  29. }
  30. private static StringBuilder SerializeType(Type type, bool withAssemblyName = true, StringBuilder typeNameBuilder = null)
  31. {
  32. typeNameBuilder = typeNameBuilder ?? new StringBuilder();
  33. if (type.DeclaringType != null)
  34. {
  35. SerializeType(type.DeclaringType, false, typeNameBuilder).Append('+');
  36. }
  37. else if (type.Namespace != null)
  38. {
  39. typeNameBuilder.Append(type.Namespace).Append('.');
  40. }
  41. typeNameBuilder.Append(type.Name);
  42. if (type.GenericTypeArguments.Length > 0)
  43. {
  44. SerializeTypes(type.GenericTypeArguments, '[', ']', typeNameBuilder);
  45. }
  46. if (!withAssemblyName)
  47. {
  48. return typeNameBuilder;
  49. }
  50. var assemblyName = type.GetTypeInfo().Assembly.GetName().Name;
  51. if (!SystemAssemblyNames.Contains(assemblyName))
  52. {
  53. typeNameBuilder.Append(", ").Append(assemblyName);
  54. }
  55. return typeNameBuilder;
  56. }
  57. private static StringBuilder SerializeTypes(Type[] types, char beginTypeDelimiter = '"', char endTypeDelimiter = '"', StringBuilder typeNamesBuilder = null)
  58. {
  59. if (types == null)
  60. {
  61. return null;
  62. }
  63. if (typeNamesBuilder == null)
  64. {
  65. typeNamesBuilder = new StringBuilder();
  66. }
  67. typeNamesBuilder.Append('[');
  68. for (int i = 0; i < types.Length; i++)
  69. {
  70. typeNamesBuilder.Append(beginTypeDelimiter);
  71. SerializeType(types[i], true, typeNamesBuilder);
  72. typeNamesBuilder.Append(endTypeDelimiter);
  73. if (i != types.Length - 1)
  74. {
  75. typeNamesBuilder.Append(',');
  76. }
  77. }
  78. return typeNamesBuilder.Append(']');
  79. }
  80. }
  81. }