EffectManagerSerializer.cs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. namespace MeidoPhotoStudio.Plugin;
  6. public class EffectManagerSerializer : Serializer<EffectManager>
  7. {
  8. private const short Version = 1;
  9. public override void Serialize(EffectManager manager, BinaryWriter writer)
  10. {
  11. writer.Write(EffectManager.Header);
  12. writer.WriteVersion(Version);
  13. foreach (var effectManager in GetEffectManagers(manager).Values)
  14. Serialization.Get(effectManager.GetType()).Serialize(effectManager, writer);
  15. writer.Write(EffectManager.Footer);
  16. }
  17. public override void Deserialize(EffectManager manager, BinaryReader reader, SceneMetadata metadata)
  18. {
  19. _ = reader.ReadVersion();
  20. var headerToManager =
  21. GetEffectManagers(manager).ToDictionary(
  22. x => (string)x.Key.GetField("header").GetValue(null),
  23. y => y.Value);
  24. string header;
  25. while ((header = reader.ReadString()) is not EffectManager.Footer)
  26. {
  27. var effectManager = headerToManager[header];
  28. Serialization.Get(effectManager.GetType()).Deserialize(effectManager, reader, metadata);
  29. }
  30. }
  31. private static Dictionary<Type, IEffectManager> GetEffectManagers(EffectManager manager) =>
  32. Utility.GetFieldValue<EffectManager, Dictionary<Type, IEffectManager>>(manager, "EffectManagers");
  33. }