Hi,
Test TestSerializable.serialize_node_04 serializes and deserializes a
Node.ANY.
All serialization is handled via Node.writeReplace() indirecting to
SNode and SNode.readResolve() to deserialize.
The provided serializer is Jena's RDF Thrift. ThriftConvert.toThrift
handles the conversion for Thrift.
There is nothing in Node.ANY. Node.writeReplace points to
oaj.system.SerializerRDF.
Does JavaSerializer handle writeReplace? Default serialization of
Node_URI may work by accident because it has a field.
Initialization is in org.apache.jena.system.SerializerRDF, which is
called from InitRIOT which is called by by system initialization based
on ServiceLoader.
Andy
On 20/01/17 18:35, Dick Murray wrote:
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);
}
}