using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.Serialization.Formatters.Binary; using System.Text; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; namespace _2DGAMELIB { public static class Ser { private static SerializableAttribute s = new SerializableAttribute(); private static readonly RemappedTypeBinder Binder = new RemappedTypeBinder() .Add("_2DGAMELIB.Par", typeof(ShapePart)) .Add("_2DGAMELIB.ParT", typeof(ShapePartT)); private static BinaryFormatter NewFormatter() { return new BinaryFormatter { Binder = Binder }; } private static JsonSerializerSettings CreateSettings() { var settings = new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.All, TypeNameHandling = TypeNameHandling.All, Formatting = Newtonsoft.Json.Formatting.Indented, NullValueHandling = NullValueHandling.Ignore }; settings.Converters.Add(new OrderedDictionaryConverter()); settings.Converters.Add(new OrderedDictionaryConverter()); settings.Converters.Add(new OrderedDictionaryConverter()); settings.Converters.Add(new OrderedDictionaryConverter()); return settings; } public static T DeepCopy(this T Object) { BinaryFormatter binaryFormatter = NewFormatter(); using MemoryStream memoryStream = new MemoryStream(); binaryFormatter.Serialize(memoryStream, Object); memoryStream.Position = 0L; return (T)binaryFormatter.Deserialize(memoryStream); } public static byte[] ToSerialBytes(this T Object) { using MemoryStream memoryStream = new MemoryStream(); NewFormatter().Serialize(memoryStream, Object); return memoryStream.ToArray(); } public static T ToDeserialObject(this byte[] Bytes) { using MemoryStream serializationStream = new MemoryStream(Bytes); return (T)NewFormatter().Deserialize(serializationStream); } public static void Save(this T Object, string Path) { using FileStream serializationStream = new FileStream(Path, FileMode.Create, FileAccess.Write); NewFormatter().Serialize(serializationStream, Object); } public static T Load(this string Path) { using FileStream serializationStream = new FileStream(Path, FileMode.Open, FileAccess.Read); return (T)NewFormatter().Deserialize(serializationStream); } public static T Load(this byte[] bd) { using MemoryStream serializationStream = new MemoryStream(bd); return (T)NewFormatter().Deserialize(serializationStream); } static Ser() { } public static T JsonDeepCopy(this T Object) { var json = JsonConvert.SerializeObject(Object, CreateSettings()); return JsonConvert.DeserializeObject(json, CreateSettings()); } public static byte[] ToJsonBytes(this T Object) { var json = JsonConvert.SerializeObject(Object, CreateSettings()); return Encoding.UTF8.GetBytes(json); } public static T ToUnJsonObject(this byte[] Bytes) { var json = Encoding.UTF8.GetString(Bytes); return JsonConvert.DeserializeObject(json, CreateSettings()); } public static void ToJson(this T Object, string Path) { var json = JsonConvert.SerializeObject(Object, CreateSettings()); File.WriteAllText(Path, json); } public static T UnJson(string Path) { var json = File.ReadAllText(Path); return JsonConvert.DeserializeObject(json, CreateSettings()); } public static JsonSerializerSettings GetSettings() => CreateSettings(); } }