找不到 class 的类型标识符:class java.lang.Short

Could not find a type identifier for the class : class java.lang.Short

我在使用 GraphSONMapper

序列化 ByteShort 类型时遇到问题

我正在使用由

启动的 JanusGraph 的默认配置
docker run -it -p 8182:8182 janusgraph/janusgraph

和示例数据库 The Graph of the Gods


这里是 Short 的例子:

query = g.V().hasLabel('vertex_data_types').limit(1000).valueMap(true).toList();

mapper = GraphSONMapper.build().version(GraphSONVersion.V3_0).addRegistry(JanusGraphIoRegistry.instance()).create().createMapper();

mapper.writeValueAsString(query)

完整回复:

gremlin> query = g.V().hasLabel('vertex_data_types').limit(1000).valueMap(true).toList();
==>{id=12520, label=vertex_data_types, test_short=[2], test_int=[5]}
gremlin> mapper = GraphSONMapper.build().version(GraphSONVersion.V3_0).addRegistry(JanusGraphIoRegistry.instance()).create().createMapper();
==>org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper@789b15a4
gremlin> mapper.writeValueAsString(query)
Could not find a type identifier for the class : class java.lang.Short. Make sure the value to serialize has a type identifier registered for its class.
Type ':help' or ':h' for help.
Display stack trace? [yN]Y
java.lang.IllegalArgumentException: Could not find a type identifier for the class : class java.lang.Short. Make sure the value to serialize has a type identifier registered for its class.
        at org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONTypeIdResolver.idFromValueAndType(GraphSONTypeIdResolver.java:82)
        at org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONTypeSerializerV3d0.writeTypePrefix(GraphSONTypeSerializerV3d0.java:83)
        at org.apache.tinkerpop.shaded.jackson.databind.ser.std.StdScalarSerializer.serializeWithType(StdScalarSerializer.java:44)
        at org.apache.tinkerpop.shaded.jackson.databind.ser.impl.TypeWrappedSerializer.serialize(TypeWrappedSerializer.java:32)
        at org.apache.tinkerpop.shaded.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
        at org.apache.tinkerpop.shaded.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
        at org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2656)
        at org.apache.tinkerpop.shaded.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:381)
        at org.apache.tinkerpop.gremlin.structure.io.graphson.JavaUtilSerializersV3d0$ListJacksonSerializer.serialize(JavaUtilSerializersV3d0.java:127)
        at org.apache.tinkerpop.gremlin.structure.io.graphson.JavaUtilSerializersV3d0$ListJacksonSerializer.serializeWithType(JavaUtilSerializersV3d0.java:135)
        at org.apache.tinkerpop.gremlin.structure.io.graphson.JavaUtilSerializersV3d0$ListJacksonSerializer.serializeWithType(JavaUtilSerializersV3d0.java:118)
        at org.apache.tinkerpop.shaded.jackson.databind.ser.impl.TypeWrappedSerializer.serialize(TypeWrappedSerializer.java:32)
        at org.apache.tinkerpop.shaded.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
        at org.apache.tinkerpop.shaded.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
        at org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2656)
        at org.apache.tinkerpop.shaded.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:381)
        at org.apache.tinkerpop.gremlin.structure.io.graphson.JavaUtilSerializersV3d0$MapJacksonSerializer.serialize(JavaUtilSerializersV3d0.java:59)
        at org.apache.tinkerpop.gremlin.structure.io.graphson.JavaUtilSerializersV3d0$MapJacksonSerializer.serializeWithType(JavaUtilSerializersV3d0.java:67)
        at org.apache.tinkerpop.gremlin.structure.io.graphson.JavaUtilSerializersV3d0$MapJacksonSerializer.serializeWithType(JavaUtilSerializersV3d0.java:49)
        at org.apache.tinkerpop.shaded.jackson.databind.ser.impl.TypeWrappedSerializer.serialize(TypeWrappedSerializer.java:32)
        at org.apache.tinkerpop.shaded.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
        at org.apache.tinkerpop.shaded.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
        at org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2656)
        at org.apache.tinkerpop.shaded.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:381)
        at org.apache.tinkerpop.gremlin.structure.io.graphson.JavaUtilSerializersV3d0$ListJacksonSerializer.serialize(JavaUtilSerializersV3d0.java:127)
        at org.apache.tinkerpop.gremlin.structure.io.graphson.JavaUtilSerializersV3d0$ListJacksonSerializer.serializeWithType(JavaUtilSerializersV3d0.java:135)
        at org.apache.tinkerpop.gremlin.structure.io.graphson.JavaUtilSerializersV3d0$ListJacksonSerializer.serializeWithType(JavaUtilSerializersV3d0.java:118)
        at org.apache.tinkerpop.shaded.jackson.databind.ser.impl.TypeWrappedSerializer.serialize(TypeWrappedSerializer.java:32)
        at org.apache.tinkerpop.shaded.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
        at org.apache.tinkerpop.shaded.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
        at org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3906)
        at org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3220)
        at org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper$writeValueAsString.call(Unknown Source)
        at Script64.run(Script64.groovy:1)
        at org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine.eval(GremlinGroovyScriptEngine.java:674)
        at org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine.eval(GremlinGroovyScriptEngine.java:376)
        at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:233)
        at org.apache.tinkerpop.gremlin.groovy.engine.GremlinExecutor.lambda$eval[=15=](GremlinExecutor.java:267)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
gremlin> 
gremlin> g.getGraph().openManagement().printPropertyKeys()
==>------------------------------------------------------------------------------------------------
Property Key Name              | Cardinality | Data Type                                          |
---------------------------------------------------------------------------------------------------
test_short                     | SINGLE      | class java.lang.Short                              |
test_int                       | SINGLE      | class java.lang.Integer                            |
name                           | SINGLE      | class java.lang.String                             |
age                            | SINGLE      | class java.lang.Integer                            |
time                           | SINGLE      | class java.lang.Integer                            |
reason                         | SINGLE      | class java.lang.String                             |
place                          | SINGLE      | class org.janusgraph.core.attribute.Geoshape       |
---------------------------------------------------------------------------------------------------

为什么 GraphSONMapper 无法序列化 ByteShort 数据类型?是否需要任何额外的配置?

我不知道为什么,也许这是一个疏忽,但是 GraphSON has never supported short or byte serialization. If you need such support you should switch to GraphBinary. On older versions, if you were using the JVM, you might have also considered Gryo,但现在不赞成使用 GraphBinary。

如果您必须使用 GraphSON,则意味着为这些类型编写您自己的自定义序列化程序(通常作为 IoRegistry 实现的一部分),然后将它们配置到服务器和客户端中。您可以通过检查 JanusGraphIoRegistry or perhaps a more simple implementation of the TinkerIoRegistry.

大致了解如何执行此操作

GraphSON 可以序列化短类型和字节类型。我在 discussion tab on GitHub and received this link

中问过这个问题

这是我的代码现在的样子:

GraphSONMapper.
            build().
            typeInfo(org.apache.tinkerpop.gremlin.structure.io.graphson.TypeInfo.PARTIAL_TYPES).
            addCustomModule(org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONXModuleV2d0.build().create(false)).
            version(GraphSONVersion.V3_0).
            addRegistry(JanusGraphIoRegistry.instance()).
            create().
            createMapper().
            writeValueAsString(query)