Skip to content

SerializationException when PythonEngine.Shutdown() #2221

@muler415

Description

@muler415

Environment

  • Pythonnet version: 3.0.1
  • Python version: 3.8
  • Operating System: win11
  • .NET Runtime: 4.6.1

Details

  • Describe what you were trying to get done.

    my python code listed as following:

import datetime
import csv
import clr
clr.AddReference('CyberStone.Atp.Storage')
from CyberStone.Atp.Storage.Query import QueryCondition
from CyberStone.Atp.Modules.Analysis.Models import SearchResModel
from System.Collections.Generic import List
from System import String, DateTime

#define query condition
condition = QueryCondition()
condition.QueryValueVariables = List[String]()
condition.QueryValueVariables.Add('Decoder/projectValue')
condition.RowMax = 100
condition.StartTime = DateTime(2018, 8, 2)
condition.EndTime = DateTime(2018, 8, 3)

#start query database
result = dataAnalysis.GetSearchDataSet(condition)
print(result.Count) 

when I execute PythonEngine.Shutdown(), there is exception. do you know how to resolve it?

System.Runtime.Serialization.SerializationException
HResult=0x8013150C
Message=程序集“CyberStone.Atp.Modules.Analysis, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中的类型“CyberStone.Atp.Modules.Analysis.Models.SearchResModel”未标记为可序列化。
Source=mscorlib
StackTrace:
at System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type)
at System.Collections.Concurrent.ConcurrentDictionary2.GetOrAdd(TKey key, Func2 valueFactory)
at System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context)
at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()
at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, SerializationBinder binder)
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteArray(WriteObjectInfo objectInfo, NameInfo memberNameInfo, WriteObjectInfo memberObjectInfo)
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
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 CyberStone.Atp.Infrastructure.Python.PythonNetScriptRunner.Run(String scripttext, PythonNetScope userscope) in D:\repo\ATP56\CSharp\Base\CyberStone.Atp.Infrastructure\PythonNet\PythonNetScriptRunner.cs:line 211
at CyberStone.Atp.Modules.TestScript.PythonNet.ViewModels.PythonNetDocument.<>c__DisplayClass25_0.b__0() in D:\repo\ATP56\CSharp\Modules\CyberStone.Atp.Modules.TestScript\PythonNet\ViewModels\PythonNetDocument.cs:line 220
at System.Threading.Tasks.Task.Execute()

            PythonEngine.Initialize();
            try
            {
                using (PythonRuntime.Py.GIL())
                {
                    // Capture the output in a StringWriter
                    using (var outputWriter = new StringWriter())
                    {
                        // Redirect Python's sys.stdout to the custom StringWriter
                        var originalOutput = Console.Out;
                        Console.SetOut(outputWriter);

                        dynamic sys = Py.Import("sys");
                        dynamic pythonIO = Py.Import("io");

                        // Redirect Python's sys.stdout to a custom StringIO object
                        dynamic originalStdout = sys.stdout;
                        dynamic captureStream = pythonIO.StringIO();
                        sys.stdout = captureStream;

                        try
                        {
                            PyObject p = PythonEngine.Compile(_scripttext);

                            _scope.CreatePythonNetScope();
                            _scope.Scope.Exec(_scripttext);
                            //PythonRuntime.PythonEngine.Exec(_scripttext);
                        }
                        catch (Exception ex)
                        {
                            capturedOutput += $"{ex.Message};";
                        }
                        finally
                        {
                            // Reset sys.stdout to the original value
                            sys.stdout = originalStdout;
                        }

                        // Get the captured output from the StringIO object
                        capturedOutput += captureStream.getvalue().ToString();
                    }
                }
            }
            catch(Exception ex)
            {
            }
            finally
            {
                PythonEngine.Shutdown();
            }
    print('TODO')
  • If there was a crash, please include the traceback here.
    print('TODO')

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions