Serialization.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. namespace MeidoPhotoStudio.Plugin;
  6. public static class Serialization
  7. {
  8. private static readonly Dictionary<Type, ISerializer> Serializers;
  9. private static readonly Dictionary<Type, ISimpleSerializer> SimpleSerializers;
  10. static Serialization()
  11. {
  12. var types =
  13. (from t in typeof(MeidoPhotoStudio).Assembly.GetTypes()
  14. let baseType = t.BaseType
  15. where !t.IsAbstract && !t.IsInterface && baseType?.IsGenericType == true
  16. select new { type = t, baseType }).ToArray();
  17. Serializers = types.Where(t => t.baseType.GetGenericTypeDefinition() == typeof(Serializer<>))
  18. .Select(t => new { t.type, arg = t.baseType.GetGenericArguments()[0] })
  19. .ToDictionary(x => x.arg, x => (ISerializer)Activator.CreateInstance(x.type));
  20. SimpleSerializers = types.Where(t => t.baseType.GetGenericTypeDefinition() == typeof(SimpleSerializer<>))
  21. .Select(t => new { t.type, arg = t.baseType.GetGenericArguments()[0] })
  22. .ToDictionary(x => x.arg, x => (ISimpleSerializer)Activator.CreateInstance(x.type));
  23. }
  24. public static Serializer<T> Get<T>() =>
  25. Serializers[typeof(T)] as Serializer<T>;
  26. public static ISerializer Get(Type type) =>
  27. Serializers[type];
  28. public static SimpleSerializer<T> GetSimple<T>() =>
  29. SimpleSerializers[typeof(T)] as SimpleSerializer<T>;
  30. public static ISimpleSerializer GetSimple(Type type) =>
  31. SimpleSerializers[type];
  32. public static short ReadVersion(this BinaryReader reader) =>
  33. reader.ReadInt16();
  34. public static void WriteVersion(this BinaryWriter writer, short version) =>
  35. writer.Write(version);
  36. }