如何在serialVersionUID发生变化后在java中加载libsvm模型

时间:2014-03-19 14:21:53

标签: java serialization weka libsvm serialversionuid

我在weka上训练了libsvm模型然后我保存了模型。现在我想在java中使用这个模型。

Classifier cls = (Classifier)weka.core.SerializationHelper.read(this.modelPath);

我收到此错误

  

“java.io.InvalidClassException:libsvm.svm_model; local class   不兼容:stream classdesc serialVersionUID =   -8642637231196646922,本地类serialVersionUID = 2709444323471798245“

当我运行上面的代码。我想知道如何加载和使用模型。

2 个答案:

答案 0 :(得分:2)

您可能在保存模型的时间和尝试加载模型的时间之间更改了类定义(例如,请参阅What is a serialVersionUID and why should I use it?以获得详细说明)。将serialVersionUID视为一种校验和,确保您不会加载过时的类。除非你想要的是因为你比Java更了解你仍然可以使用旧模型 - 在这种情况下你可以手动设置该ID。为了告诉Java您当前的分类器仍然是最新的,请添加

static final long serialVersionUID = -8642637231196646922;

到班级的代码。

现在我想知道:Classifier看起来像是Weka内置类。我不确定在这种情况下可以轻松更改serialVersionUID。你有没有更新Weka版本?如果你真的投资了你的模型文件,你可能想进入Weka的源代码并在那里更改serialVersionUID

答案 1 :(得分:1)

不必乱用serialVersionUID。使用SerializationHelper保存/加载LibSVM模型文件(如本other answer中所述):

weka.core.SerializationHelper.write("/some/where/svm.model", svmModel);

LibSVM svm = (LibSVM) weka.core.SerializationHelper.read("/some/where/svm.model");