Gremlin.net使用Tree()查询时抛出异常及序列化相关问题
问题解决:Gremlin.Net执行Tree查询时的序列化/反序列化错误
问题描述
执行以下Gremlin查询时抛出System.Collections.Generic.KeyNotFoundException: 'The given key 'DataType{ TypeCode = 43 }' was not present in the dictionary.'异常:
var result = g .V() .Repeat(OutE("composed-of").InV().SimplePath()) .Tree<object>() .Promise<dynamic>(t => t.ToList());
切换为GraphSON3MessageSerializer后,又出现新错误:Deserializer for "g:Tree" not found,推测TypeCode43对应Gremlin的g:Tree类型。
服务器Docker部署配置如下:
services gramling_server: image: tinkerpop/gremlin-server restart: always platform: linux/x86_64 ports: - "8182:8182" volumes: - tinkerpop_data_container:/data
解决方法
问题核心是Gremlin.Net默认序列化器未包含g:Tree类型的反序列化逻辑,需手动为GraphSON3序列化器注册Tree的反序列化器,具体步骤:
对齐版本
确保本地NuGet的Gremlin.Net版本与服务器使用的tinkerpop/gremlin-server镜像版本一致(比如均为3.6.x系列),版本不匹配会导致序列化规则不兼容。自定义GraphSON3序列化器
创建序列化器时,显式添加TreeSerializer到配置中:
using Gremlin.Net.Driver; using Gremlin.Net.Structure.IO.GraphSON; // 配置包含Tree反序列化器的GraphSON3序列化器 var graphSON3Serializer = new GraphSON3MessageSerializer( new GraphSON3ReaderBuilder() .AddDeserializer(new TreeSerializer()) .Create(), new GraphSON3WriterBuilder().Create() ); // 初始化GremlinClient时使用该自定义序列化器 var client = new GremlinClient( new GremlinServer("localhost", 8182), graphSON3Serializer );
- 重新执行查询
用配置好的GremlinClient执行原Tree查询,即可正常反序列化结果。
补充说明
Tree是Gremlin的特殊数据结构,不属于默认基础类型序列化范围,因此需要显式注册对应序列化器。后续遇到其他Gremlin特定结构的序列化问题,都可以通过类似方式添加对应序列化/反序列化器解决。
内容的提问来源于stack exchange,提问作者zXynK
相关产品推荐
相关产品推荐

