在Java / Android [WEKA]中序列化和反序列化对象

时间:2016-09-28 20:22:30

标签: java android serialization deserialization weka

我在我的计算机上序列化已经训练过的分类器,我正在尝试在Android上反序列化它。但是,当我尝试在我的Android设备上反序列化时,我在控制台中看到了这个日志:

W/System.err: java.io.InvalidClassException: weka.classifiers.meta.LogitBoost;
Incompatible class (SUID): weka.classifiers.meta.LogitBoost: static final long serialVersionUID =-1105660358715833753L;
but expected weka.classifiers.meta.LogitBoost: static final long 
serialVersionUID =-3905660358715833753L;
W/System.err:     at java.io.ObjectInputStream.verifyAndInit(ObjectInputStream.java:2336)

不确定该怎么做。我必须提到我正在使用剥离版本的WEKA here

这是我的分类器类,用于在我的计算机上训练和序列化分类器:

public class ClassifierSerializer {
//variables//
public ClassifierSerializer(String classifierName,
                            String classifierParameters,
                            String dataSourceFile,
                            String outputFileName) {

    this.classifierName = classifierName;
    this.classifierParameters = classifierParameters;
    this.dataSourceFile = dataSourceFile;
    this.outputFileName = outputFileName;
}

/**
 * Output the trained classifier to the specified file
 */
public void serialize() {
    readFile();
    train();
    writeToFile();
}
private void train() {
        classifier = AbstractClassifier.forName(classifierName, Utils.splitOptions(classifierParameters));
        classifier.buildClassifier(dataset);
 }
private void writeToFile() {
    // Serialize classifier
    FileOutputStream fileStream;

    fileStream = new FileOutputStream(outputFileName);
    ObjectOutputStream objectStream = new ObjectOutputStream(fileStream);
    objectStream.writeObject(classifier);
    objectStream.close();
    fileStream.close(); 
}
}

这就是我在主方法中使用它的方式:

public static void main(String[] args) throws Exception {
    String datasource = "C:\\Users\\Georgi\\Desktop\\HAR_training.arff";
    ClassifierSerializer classifierSerializer = new ClassifierSerializer(
            "weka.classifiers.meta.LogitBoost",
            "-P 100  -L -1.7976931348623157E308 -H 1.0 -S 1 -I 10 -W weka.classifiers.trees.DecisionStump",
            datasource,
            "logit.data");
    classifierSerializer.serialize();
 }

这就是我在Android上反序列化的方法(我的资产文件夹中有罚款):

private Classifier getClassifier() {
    // Add logic to make a network call to download the trained offline model/classifier
    String filename = "logit.data";
    ObjectInputStream objectStream = new ObjectInputStream(getAssets().open(filename));
    Object obj =objectStream.readObject();

    if (obj instanceof Classifier) {
        return (Classifier) obj;
    } else {
        return null;
    }

}

1 个答案:

答案 0 :(得分:0)

我发现了发生了什么(有点)。我决定用我在Android项目上使用的相同剥离版本的weka库替换我的PC上的InteliJ项目中的完整weka.jar库。出于某种原因解决了这个问题。我假设,版本有点不同,一些变化差异导致了问题。