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;
}
}
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) –
@ 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. –