Search code examples
javaserializationkryotinkerpop3

Tinkerpop registering custom class kryo


I am trying to add java.util.GregorianCalendar class to kryo serializer on Apache tinkerpop 3.3.3. To prevent below exception happening

Exception in thread "main" java.lang.IllegalArgumentException: Class is not registered: java.util.GregorianCalendar
Note: To register this class use: kryo.register(java.util.GregorianCalendar.class);
    at org.apache.tinkerpop.shaded.kryo.Kryo.getRegistration(Kryo.java:484)
    at org.apache.tinkerpop.gremlin.structure.io.gryo.AbstractGryoClassResolver.writeClass(AbstractGryoClassResolver.java:110)
    at org.apache.tinkerpop.shaded.kryo.Kryo.writeClass(Kryo.java:514)
    at org.apache.tinkerpop.shaded.kryo.Kryo.writeClassAndObject(Kryo.java:619)
    at org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.shaded.ShadedKryoAdapter.writeClassAndObject(ShadedKryoAdapter.java:49)
    at org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.shaded.ShadedKryoAdapter.writeClassAndObject(ShadedKryoAdapter.java:24)

Since tinkerpop uses some kind of "shaded" kryo version I simply cant call kryo.register(). So far i tried

GryoMapper mapper =
GryoMapper.build().addCustom(java.util.GregorianCalendar.class).create();
List l = mapper.getRegisteredClasses();

And was able to observe that java.util.GregorianCalendar is registered. But I do not know what should I do next to use this custom mapper I checked javadocs and got confused.I also use below code to write TinkerGraph instance to file. Any help will be appreciated.

this.graph.io(IoCore.gryo()).writeGraph(filePath);

Solution

  • I think if you've got a GryoMapper instance then I'd just instantiate the GryoWriter directly like this:

    File file = new File("C:/myfile.txt");
    OutputStream fos = new FileOutputStream(file);
    GryoMapper mapper = GryoMapper.build().addCustom(java.util.GregorianCalendar.class).create()
    GryoWriter writer = GryoWriter.build().mapper(mapper).create()
    writer.writeGraph(fos, graph)