/// <summary>
 /// Default constructor
 /// </summary>
 /// <param name="settings">The serializer settings</param>
 /// <param name="stream">The stream to serialize to</param>
 /// <param name="logger">An optional logger to use for logging</param>
 public BinarySerializer(IBinarySerializerSettings settings, Stream stream, IBinarySerializerLogger logger = null)
 {
     Settings = settings;
     Stream   = stream;
     Logger   = logger;
     Writer   = new Writer(stream, Settings.Endian);
 }
        /// <summary>
        /// Reads from a binary stream using the default deserializer
        /// </summary>
        /// <typeparam name="T">The type to deserialize to</typeparam>
        /// <param name="stream">The stream</param>
        /// <param name="settings">The serializer settings</param>
        /// <param name="logger">An optional logger to use for logging</param>
        /// <param name="onPreSerializing">Optional action to run before serializing</param>
        /// <returns>The serialized data</returns>
        public static T ReadFromStream <T>(Stream stream, IBinarySerializerSettings settings, IBinarySerializerLogger logger = null, Action <IBinarySerializer, T> onPreSerializing = null)
            where T : IBinarySerializable, new()
        {
            using (logger)
            {
                // Create the deserializer
                var s = new BinaryDeserializer(settings, stream, logger);

                // Serialize the object
                var obj = s.SerializeObject <T>(default, onPreSerializing);
 /// <summary>
 /// Reads a binary file using the default deserializer
 /// </summary>
 /// <typeparam name="T">The type to deserialize to</typeparam>
 /// <param name="filePath">The file path</param>
 /// <param name="settings">The serializer settings</param>
 /// <param name="logger">An optional logger to use for logging</param>
 /// <param name="onPreSerializing">Optional action to run before serializing</param>
 /// <returns>The serialized file data</returns>
 public static T ReadFromFile <T>(string filePath, IBinarySerializerSettings settings, IBinarySerializerLogger logger = null, Action <IBinarySerializer, T> onPreSerializing = null)
     where T : IBinarySerializable, new()
 {
     using (logger)
     {
         // Open the file as a stream
         using (var stream = File.OpenRead(filePath))
             // Read from the stream
             return(ReadFromStream <T>(stream, settings, logger, onPreSerializing));
     }
 }