Whilst this issue is reported and possibly caused by Kryo I think it's my
understanding of how Jena is or is not serializing...

I'm using Jena 3.2.0-SNAPSHOT and Kryo(Net) to serialize Jena nodes but
Kryo baulks when asked to handle a (the) Node_ANY;

Exception in thread "Server" java.lang.StackOverflowError
at
com.esotericsoftware.kryo.io.ByteBufferOutput.writeVarInt(ByteBufferOutput.java:323)
at
com.esotericsoftware.kryo.util.DefaultClassResolver.writeClass(DefaultClassResolver.java:102)
at com.esotericsoftware.kryo.Kryo.writeClass(Kryo.java:517)
at
com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:76)
at
com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:518)
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:552)
at
com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:80)
at
com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:518)
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:552)
at
com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:80)
at
com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:518)

Basically the server side dies horribly!

I've looked at SerializerRDF and Node and Node.ANY (Node_Fluid) and I
cannot see where it goes wrong.

Node_URI works without issue and a breakpoint on protected Object
writeReplace() throws ObjectStreamException {...} will break. However
Node_ANY never triggers a break...

Does Node_ANY have the code to actually serialize itself? Should I be
overriding something and returning the Node_ANY?

NB: I need to register the Node_URI class a JavaSerialization because Kryo
was trying to FieldSerialize and that was not working!

Just the shared Network class as follows;

package org.twocows.jena.mosaic.kryo;

import java.util.Iterator;

NB: I need to register the Node_URI class a JavaSerialization because Kryo
was trying to FieldSerialize and that was not working!

import org.apache.jena.graph.Node;
import org.apache.jena.graph.Node_ANY;
import org.apache.jena.graph.Node_URI;
import org.twocows.jena.mosaic.MosaicDatasetGraph;

import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.Serializer;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import com.esotericsoftware.kryo.serializers.JavaSerializer;
import com.esotericsoftware.kryonet.EndPoint;
import com.esotericsoftware.kryonet.rmi.ObjectSpace;
import com.github.jsonldjava.core.RDFDataset.Quad;

public class Network {
public static final int port = 1972;

public static final int MOSAIC_DATASET_GRAPH = 1;
// This registers objects that are going to be sent over the network.
static public void register (final EndPoint endPoint) {
Kryo kryo = endPoint.getKryo();
// This must be called in order to use ObjectSpaces.
ObjectSpace.registerClasses(kryo);
// The interfaces that will be used as remote objects must be registered.
kryo.register(MosaicDatasetGraph.class);
// The classes of all method parameters and return values
// for remote objects must also be registered.
kryo.register(ExceptionInInitializerError.class);
kryo.register(UnsupportedOperationException.class);
kryo.register(String.class);
kryo.register(Node.class, new JavaSerializer());
kryo.register(Node_URI.class, new JavaSerializer());
kryo.register(Node_ANY.class, new JavaSerializer());
kryo.register(Quad.class);
kryo.register(Iterator.class);
}
}

Reply via email to