2016-09-28 3 views
0

Ich bin eine bereits ausgebildete Klassifizierer Serialisierung auf meinem Computer und ich versuche es auf Android zu deserialisieren. Allerdings, wenn ich versuche, es auf meinem Android-Gerät deserialisieren sehe ich dieses Protokoll in der Konsole:Serialisieren und Deserialisieren eines Objekts in Java/Android [WEKA]

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) 

nicht sicher, was zu tun ist. Ich muss erwähnen, dass ich eine abgespeckte Version von WEKA here benutze.

Das ist meine Klassifikator Klasse zu trainieren und serialisiert den Klassifikator auf meinem Computer verwendet:

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(); 
} 
} 

Dies ist, wie ich es in meiner Haupt-Methode verwenden:

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(); 
} 

Und so ich bin Deserialisieren es auf Android (ich die Geldstrafe in meinem Vermögen Ordner):

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

Setzen Sie die serialVersionUID in ClassifierSerializer? Es sollte das selbe wie das sein, das Sie erhalten, wenn Sie die Datei lesen (das ist das Problem, das Sie haben) –

+0

@ ale.m Ich fügte eine weitere Methode in meinem classSerializer hinzu. Ich stelle es nicht fest. Ich bin mir nicht sicher, wie ich das machen kann. –

Antwort

0

ich herausgefunden habe, was goin g auf (Art von). Ich entschied mich dafür, die komplette weka.jar-Bibliothek in meinem InteliJ-Projekt auf meinem PC durch dieselbe stripped Version der weka-Bibliothek zu ersetzen, die ich auf meinem Android-Projekt verwende. Aus irgendeinem Grund hat das das Problem gelöst. Ich nehme an, die Versionen waren ein bisschen anders und einige Änderungsunterschiede verursachten das Problem.

+1

Einige Idioten im Weka-Projekt haben die 'serialVersionUID' zwischen den Versionen geändert. – EJP

+0

@EJP Ja, ich denke das ist was passiert sein muss! :) –

Verwandte Themen