'System.Threading.CancellationToken'...未标记为可序列化

'System.Threading.CancellationToken'...is not marked as serializable

我正在使用 Accord.NET 创建并保存一个 StepwiseLogisticRegressionModel。当我尝试序列化和保存模型时,出现以下错误:

Type 'System.Threading.CancellationToken' in Assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable.

保存其他模型(例如 NaiveBayes)似乎工作正常。

这是我试过的代码:

StepwiseLogisticRegressionAnalysis model;
string file = Path.Combine(path, filename);
Serializer.Save(obj: model, path: file);

StepwiseLogisticRegressionAnalysis model;
string file = Path.Combine(path, filename);
using(FileStream stream = new FileStream(filename, FileMode.Create))
{
    var binaryFormatter = new BinaryFormatter();
    binaryFormatter.Serialize(stream, best);
}

我该如何解决这个问题?


编辑:这是一个工作示例:

double[][] inputs =
{
    //            Age  Smoking
    new double[] { 55,    0   },  // 1
    new double[] { 28,    0   },  // 2
    new double[] { 65,    1   },  // 3
    new double[] { 46,    0   },  // 4
    new double[] { 86,    1   },  // 5
    new double[] { 56,    1   },  // 6
    new double[] { 85,    0   },  // 7
    new double[] { 33,    0   },  // 8
    new double[] { 21,    1   },  // 9
    new double[] { 42,    1   },  // 10
    new double[] { 33,    0   },  // 11
    new double[] { 20,    1   },  // 12
    new double[] { 43,    1   },  // 13
    new double[] { 31,    1   },  // 14
    new double[] { 22,    1   },  // 15
    new double[] { 43,    1   },  // 16
    new double[] { 46,    0   },  // 17
    new double[] { 86,    1   },  // 18
    new double[] { 56,    1   },  // 19
    new double[] { 55,    0   },  // 20
};

double[] output =
{
    0, 0, 0, 1, 1, 1, 0, 0, 0, 1,
    0, 1, 1, 1, 1, 1, 0, 1, 1, 0
};

var regression = new StepwiseLogisticRegressionAnalysis(inputs, output,
    new[] { "Age", "Smoking" }, "Cancer");

regression.Learn(inputs, output); 

var path = $@"C:\";
var filename = "StepWiseRegressionModel.accord";
string file = Path.Combine(path, filename);
Serializer.Save(regression, file);

看起来 StepwiseLogisticRegressionAnalysis(或子对象)中某处有一个私有字段,其中包含一个 CancellationToken,无法序列化。

您应该尝试序列化分析的输出模型(参见 regression.Current.Regression 属性)。

请记住,对象的二进制序列化相当脆弱,除非它得到特别支持。反序列化环境必须与序列化完全相同(相同的库版本、C# 版本、OS 版本等)。序列化数据,然后从中重建对象会更好。