diff --git a/Server/Persistence/Persistence.cs b/Server/Persistence/Persistence.cs new file mode 100644 index 000000000..fb7ca2cc4 --- /dev/null +++ b/Server/Persistence/Persistence.cs @@ -0,0 +1,117 @@ +#region References +using System; +using System.IO; +#endregion + +namespace Server +{ + public static class Persistence + { + public static void Serialize(string path, Action serializer) + { + Serialize(new FileInfo(path), serializer); + } + + public static void Serialize(FileInfo file, Action serializer) + { + file.Refresh(); + + if (file.Directory != null && !file.Directory.Exists) + { + file.Directory.Create(); + } + + if (!file.Exists) + { + file.Create().Close(); + } + + file.Refresh(); + + using (var fs = file.OpenWrite()) + { + var writer = new BinaryFileWriter(fs, true); + + try + { + serializer(writer); + } + finally + { + writer.Flush(); + writer.Close(); + } + } + } + + public static void Deserialize(string path, Action deserializer) + { + Deserialize(path, deserializer, true); + } + + public static void Deserialize(FileInfo file, Action deserializer) + { + Deserialize(file, deserializer, true); + } + + public static void Deserialize(string path, Action deserializer, bool ensure) + { + Deserialize(new FileInfo(path), deserializer, ensure); + } + + public static void Deserialize(FileInfo file, Action deserializer, bool ensure) + { + file.Refresh(); + + if (file.Directory != null && !file.Directory.Exists) + { + if (!ensure) + { + throw new DirectoryNotFoundException(); + } + + file.Directory.Create(); + } + + if (!file.Exists) + { + if (!ensure) + { + throw new FileNotFoundException + { + Source = file.FullName + }; + } + + file.Create().Close(); + } + + file.Refresh(); + + using (var fs = file.OpenRead()) + { + var reader = new BinaryFileReader(new BinaryReader(fs)); + + try + { + deserializer(reader); + } + catch (EndOfStreamException eos) + { + if (file.Length > 0) + { + Console.WriteLine("[Persistence]: {0}", eos); + } + } + catch (Exception e) + { + Console.WriteLine("[Persistence]: {0}", e); + } + finally + { + reader.Close(); + } + } + } + } +} \ No newline at end of file diff --git a/Server/Server.csproj b/Server/Server.csproj index 371065101..eb0b69d49 100644 --- a/Server/Server.csproj +++ b/Server/Server.csproj @@ -182,6 +182,7 @@ +