using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; namespace Abp.Runtime.Serialization { /// /// This class is used to simplify serialization/deserialization operations. /// Uses .NET binary serialization. /// public static class BinarySerializationHelper { /// /// Serializes an object and returns as a byte array. /// /// object to be serialized /// bytes of object public static byte[] Serialize(object obj) { using (var memoryStream = new MemoryStream()) { CreateBinaryFormatter().Serialize(memoryStream, obj); return memoryStream.ToArray(); } } /// /// Serializes an object into a stream. /// /// object to be serialized /// Stream to serialize in /// bytes of object public static void Serialize(object obj, Stream stream) { CreateBinaryFormatter().Serialize(stream, obj); } /// /// Deserializes an object from given byte array. /// /// The byte array that contains object /// deserialized object public static object Deserialize(byte[] bytes) { using (var memoryStream = new MemoryStream(bytes)) { return CreateBinaryFormatter().Deserialize(memoryStream); } } /// /// Deserializes an object from given stream. /// /// The stream that contains object /// deserialized object public static object Deserialize(Stream stream) { return CreateBinaryFormatter().Deserialize(stream); } /// /// Deserializes an object from given byte array. /// Difference from is that; this method can also deserialize /// types that are defined in dynamically loaded assemblies (like PlugIns). /// /// The byte array that contains object /// deserialized object public static object DeserializeExtended(byte[] bytes) { using (var memoryStream = new MemoryStream(bytes)) { return CreateBinaryFormatter(true).Deserialize(memoryStream); } } /// /// Deserializes an object from given stream. /// Difference from is that; this method can also deserialize /// types that are defined in dynamically loaded assemblies (like PlugIns). /// /// The stream that contains object /// deserialized object public static object DeserializeExtended(Stream stream) { return CreateBinaryFormatter(true).Deserialize(stream); } private static BinaryFormatter CreateBinaryFormatter(bool extended = false) { if (extended) { return new BinaryFormatter { //TODO: AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple, Binder = new ExtendedSerializationBinder() }; } else { return new BinaryFormatter(); } } /// /// This class is used in deserializing to allow deserializing objects that are defined /// in assemlies that are load in runtime (like PlugIns). /// private sealed class ExtendedSerializationBinder : SerializationBinder { public override Type BindToType(string assemblyName, string typeName) { var toAssemblyName = assemblyName.Split(',')[0]; foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { if (assembly.FullName.Split(',')[0] == toAssemblyName) { return assembly.GetType(typeName); } } return Type.GetType(string.Format("{0}, {1}", typeName, assemblyName)); } } } }