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));
}
}
}
}