using Abp.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
namespace Abp.Runtime.Caching
{
///
/// A class to hold the Type information and Serialized payload for data stored in the cache.
///
public class AbpCacheData
{
private static readonly IReadOnlyList SystemAssemblyNames = new List { "mscorlib", "System.Private.CoreLib" };
public AbpCacheData(
string type, string payload)
{
Type = type;
Payload = payload;
}
public string Payload { get; set; }
public string Type { get; set; }
public static AbpCacheData Deserialize(string serializedCacheData) => serializedCacheData.FromJsonString();
public static AbpCacheData Serialize(object obj)
{
return new AbpCacheData(
SerializeType(obj.GetType()).ToString(),
obj.ToJsonString());
}
private static StringBuilder SerializeType(Type type, bool withAssemblyName = true, StringBuilder typeNameBuilder = null)
{
typeNameBuilder = typeNameBuilder ?? new StringBuilder();
if (type.DeclaringType != null)
{
SerializeType(type.DeclaringType, false, typeNameBuilder).Append('+');
}
else if (type.Namespace != null)
{
typeNameBuilder.Append(type.Namespace).Append('.');
}
typeNameBuilder.Append(type.Name);
if (type.GenericTypeArguments.Length > 0)
{
SerializeTypes(type.GenericTypeArguments, '[', ']', typeNameBuilder);
}
if (!withAssemblyName)
{
return typeNameBuilder;
}
var assemblyName = type.GetTypeInfo().Assembly.GetName().Name;
if (!SystemAssemblyNames.Contains(assemblyName))
{
typeNameBuilder.Append(", ").Append(assemblyName);
}
return typeNameBuilder;
}
private static StringBuilder SerializeTypes(Type[] types, char beginTypeDelimiter = '"', char endTypeDelimiter = '"', StringBuilder typeNamesBuilder = null)
{
if (types == null)
{
return null;
}
if (typeNamesBuilder == null)
{
typeNamesBuilder = new StringBuilder();
}
typeNamesBuilder.Append('[');
for (int i = 0; i < types.Length; i++)
{
typeNamesBuilder.Append(beginTypeDelimiter);
SerializeType(types[i], true, typeNamesBuilder);
typeNamesBuilder.Append(endTypeDelimiter);
if (i != types.Length - 1)
{
typeNamesBuilder.Append(',');
}
}
return typeNamesBuilder.Append(']');
}
}
}