私は Stanford CoreNLP ライブラリーを試していて、メインの StanfordCoreNLP パイプライン オブジェクトが java.io.NotSerializableException をスローしてもシリアライズしたいと考えています。
全文: 実装を実行するたびに、パイプラインのアノテーターと分類子をメモリにロードするのに約 15 秒かかります。終了プロセスのメモリは約 600MB です (私の場合は簡単に保存できるほど小さいです)。このパイプラインを最初に作成した後に保存したいので、後でメモリに読み込むことができます。
ただし、NotSerializableException がスローされます。Serializable を実装する簡単なサブクラスを作成しようとしましたが、StanfordCoreNLP にはこのインターフェイスを実装しないアノテーターと分類子のプロパティがあり、それらすべてのサブクラスを作成することはできません。
Serializable を実装していないオブジェクトをシリアライズする Java ライブラリはありますか? プロパティを再帰し、同様のオブジェクトに対して同じことを行う必要があると思います。
私が試したシリアライゼーションコード:
static StanfordCoreNLP pipeline;
static String file = "/Users/ME/Desktop/pipeline.sav";
static StanfordCoreNLP pipeline() {
if (pipeline == null) {
try {
FileInputStream saveFile = new FileInputStream(file);
ObjectInputStream read = new ObjectInputStream(saveFile);
pipeline = (StanfordCoreNLP) read.readObject();
System.out.println("Pipeline loaded from file.");
read.close();
} catch (FileNotFoundException e) {
System.out.println("Cached pipeline not found. Creating new pipeline...");
Properties props = new Properties();
props.put("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref");
pipeline = new StanfordCoreNLP(props);
savePipeline(pipeline);
} catch (IOException e) {
System.err.println(e.getLocalizedMessage());
} catch (Exception e) {
System.err.println(e.getLocalizedMessage());
}
}
return pipeline;
}
static void savePipeline(StanfordCoreNLP pipeline) {
try {
FileOutputStream saveFile = new FileOutputStream(file);
ObjectOutputStream save = new ObjectOutputStream(saveFile);
save.writeObject(pipeline);
System.out.println("Pipeline saved to file.");
save.close();
} catch (FileNotFoundException e) {
System.out.println("Pipeline file not found during save.");
} catch (IOException e) {
System.err.println(e.getLocalizedMessage());
}
}