-
Notifications
You must be signed in to change notification settings - Fork 704
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
BinaryFormatter serialization and deserialization warning which throws an error in .net8 #2282
Comments
The issue happens in RuntimeData.Stash -- var runtimeStorage = new PythonNetState
{
Metatype = MetaType.SaveRuntimeData(),
ImportHookState = ImportHook.SaveRuntimeData(),
Types = TypeManager.SaveRuntimeData(),
Classes = ClassManager.SaveRuntimeData(),
SharedObjects = SaveRuntimeDataObjects(),
};
IFormatter formatter = CreateFormatter();
var ms = new MemoryStream();
formatter.Serialize(ms, runtimeStorage); internal static IFormatter CreateFormatter()
{
return FormatterType != null ?
(IFormatter)Activator.CreateInstance(FormatterType)
: new BinaryFormatter();
} While there is an option to set another formatter, it's not used and expected to be of type IFormatter which is problematic. |
Pythonnet use BinaryFormatter. and it is deprecated in .net 8. you can set RuntimeData.FormatterType to your custom formatter to get it work. if you dont want write a custom formatter, then add this line AppContext.SetSwitch("System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization", true); before you call PythonEngine.Shutdown to temporary enable BinaryFormatter. after PythonEngine.Shutdown. call AppContext.SetSwitch("System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization", false); to disable BinaryFormatter |
Facing same issue and using work around currently. But .NET 9 is getting rid of Binary Formatter altogether. So this needs to be fixed. |
PythonEngine shutdown currently relies on BinaryFormatter which has been deprecated with .NET 8. This is a known issue documented at: pythonnet/pythonnet#2282
This is a big issue as the binary formatter was deprecated as it is a serious security issue. To replace the formatter, there looks to be two high performance/low latency alternatives... Protobuf and MessagePack. Any preference which to use (MessagePack will be slightly faster than Protobuf, but Protobuf is more well known)? |
No formatter is really needed unless you are using .NET Framework. The only place where formatter is used is app domain restart, and app domains are not available in later .NETs |
This should be fixed now. |
Environment
Details
When shutting down the the PythonEngine via a Dispose method on the impermentation class, the error occurs at the PythonEngine.Shutdown(); method and throws the error System.NotSupportedException: BinaryFormatter serialization and deserialization are disabled within this application (see trace below). The same code worked in .net7 without any issues, the error message leads to this description
https://learn.microsoft.com/en-us/dotnet/standard/serialization/binaryformatter-security-guide
Proir to the Shutdown error the pythonnet works correctly and calls python functions and returns the expected results
The resolution is to add true to the .csproj file
TODO
_logger.Log is to to trace the point of failure
_logger.Log(LogLevel.Error, "Shutting down Python engine"); runs
it crashes at the PythonEngine.Shutdown(); method
_logger.Log(LogLevel.Error, "Python engine shut down"); does not run
private void Dispose(bool disposing)
{
_logger.Log(LogLevel.Error, "Dispose");
if (_disposed) return;
if (disposing)
{
_logger.Log(LogLevel.Error, "Shutting down Python engine");
PythonEngine.Shutdown();
_logger.Log(LogLevel.Error, "Python engine shut down");
}
_disposed = true;
}
System.NotSupportedException
BinaryFormatter serialization and deserialization are disabled within this application. See https://aka.ms/binaryformatter for more information.
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph)
at Python.Runtime.RuntimeData.Stash()
at Python.Runtime.Runtime.Shutdown()
at Python.Runtime.PythonEngine.Shutdown()
at EcgAi.Training.Infrastructure.Python.PythonEnvironment.Dispose(Boolean disposing) in C:\Data\Rider\EcgAi.Training\Src\EcgAi.Training.Infrastructure.Python\PythonEnvironment.cs:line 113
at EcgAi.Training.Infrastructure.Python.PythonEnvironment.Dispose() in xxxxxxxxxxxxxxxxxxxxxxxxx
The text was updated successfully, but these errors were encountered: