EntryList.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6. using Newtonsoft.Json;
  7. using System.Runtime.Serialization;
  8. using System.Runtime.Serialization.Formatters;
  9. using System.IO;
  10. namespace TodoList
  11. {
  12. public class EntryList
  13. {
  14. public UInt32 NextID = 1;
  15. public List<Entry> PreviousVersions = new List<Entry>();
  16. public Entry Root = new Entry();
  17. public static EntryList LoadFile(String File, bool PlanningMutation)
  18. {
  19. if (!System.IO.File.Exists(File))
  20. System.IO.File.WriteAllText(File, "{}");
  21. var r = LoadJsonFromAbsolutePath<EntryList>(File);
  22. if (PlanningMutation)
  23. {
  24. var copy = LoadFile(File, false);
  25. if (r.PreviousVersions.Count > 15)
  26. r.PreviousVersions.RemoveAt(0);
  27. r.PreviousVersions.Add(copy.Root);
  28. }
  29. return r;
  30. }
  31. public static void SaveFile(String File, EntryList Root)
  32. {
  33. using (StreamWriter filestream = new StreamWriter(System.IO.File.Open(File, global::System.IO.FileMode.Truncate)))
  34. using (JsonWriter writer = new JsonTextWriter(filestream))
  35. {
  36. GetStandardSerializer(null).Serialize(writer, Root);
  37. }
  38. }
  39. private static T LoadJsonFromAbsolutePath<T>(string filePath, object context = null)
  40. {
  41. using (var stream = new FileStream(filePath, FileMode.Open))
  42. using (StreamReader reader = new StreamReader(stream))
  43. {
  44. using (JsonReader json = new JsonTextReader(reader))
  45. {
  46. return GetStandardSerializer(context).Deserialize<T>(json);
  47. }
  48. }
  49. }
  50. private static JsonSerializer GetStandardSerializer(Object Context)
  51. {
  52. var serializer = new JsonSerializer
  53. {
  54. Context = new StreamingContext(StreamingContextStates.File, Context),
  55. ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
  56. TypeNameHandling = TypeNameHandling.Auto,
  57. ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor,
  58. Formatting = Formatting.Indented,
  59. PreserveReferencesHandling = PreserveReferencesHandling.Objects,
  60. };
  61. return serializer;
  62. }
  63. }
  64. }