package edu.stanford.nlp.pipeline; import edu.stanford.nlp.util.Pair; import java.io.*; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; /** * Serializes Annotation objects using the default Java serializer */ public class GenericAnnotationSerializer extends AnnotationSerializer { boolean compress = false; public GenericAnnotationSerializer(boolean compress) { this.compress = compress; } public GenericAnnotationSerializer() { this(false); } /** Turns out, an ObjectOutputStream cannot append to a file. This is dumb. */ public static class AppendingObjectOutputStream extends ObjectOutputStream { public AppendingObjectOutputStream(OutputStream out) throws IOException { super(out); } @Override protected void writeStreamHeader() throws IOException { // do not write a header, but reset reset(); } } @Override public OutputStream write(Annotation corpus, OutputStream os) throws IOException { if (os instanceof AppendingObjectOutputStream) { ((AppendingObjectOutputStream) os).writeObject(corpus); return os; } else if (os instanceof ObjectOutputStream) { ObjectOutputStream objectOutput = new AppendingObjectOutputStream(compress ? new GZIPOutputStream(os) : os); objectOutput.writeObject(corpus); return objectOutput; } else { ObjectOutputStream objectOutput = new ObjectOutputStream(compress ? new GZIPOutputStream(os) : os); objectOutput.writeObject(corpus); return objectOutput; } } @Override public Pair<Annotation, InputStream> read(InputStream is) throws IOException, ClassNotFoundException, ClassCastException { ObjectInputStream objectInput; if (is instanceof ObjectInputStream) { objectInput = (ObjectInputStream) is; } else { objectInput = new ObjectInputStream(compress ? new GZIPInputStream(is) : is); } Object annotation = objectInput.readObject(); if(annotation == null) return null; if(! (annotation instanceof Annotation)){ throw new ClassCastException("ERROR: Serialized data does not contain an Annotation!"); } return Pair.makePair((Annotation) annotation, (InputStream) objectInput); } }