【问题标题】:'System.Threading.CancellationToken'...is not marked as serializable'System.Threading.CancellationToken'...未标记为可序列化
【发布时间】:2022-01-07 02:02:20
【问题描述】:

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

Assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 中的类型'System.Threading.CancellationToken' 未标记为可序列化。

保存其他模型,如 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);

【问题讨论】:

  • 在第一个代码块中你在初始化它的值之前使用model,而在第二个代码块中你甚至没有使用model。我在您发布的代码中没有看到任何CancellationToken 的迹象。可以发minimal reproducible example吗?
  • @gunr2171 我刚刚添加了一个工作示例。
  • 该类被标记为可序列化,但该类中的令牌不可序列化。也许这是一个疏忽。如果要序列化,则应使用NonSerialized 装饰一个属性。

标签: c# serialization accord.net cancellation-token


【解决方案1】:

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

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

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

【讨论】:

  • 就是这样!我一直在绞尽脑汁想弄清楚如何序列化该字段,但我从来没有想过要简单地保存我需要的对象。
猜你喜欢
  • 2017-02-21
  • 2015-11-10
  • 2016-01-18
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 2015-02-15
相关资源
最近更新 更多