Gremlin.NET反序列化数字属性
我有一个创建顶点和边“创建”的查询。边缘有一个属性“on”,它是 unix datetime 长。当我在 Azure Cosmos DB 终端中使用以下段执行查询时,它按预期工作 - 返回一个带有“On”属性的对象,该属性是一个数字。
.project('Id', 'CreatedOn')
.by('id')
.by(
select('createdEdge')
.by('on')
)
当我使用 Gremlin.NET 从我的应用程序代码执行此查询时,它失败并显示错误:
不支持 JSON 类型。
我在源代码中看到Gremlin.NET 的反序列化逻辑似乎不处理任何数字类型。真的是这样吗?有没有办法使用 long、float、int 属性类型?
回答
Gremlin.NET 似乎不处理任何数字类型。真的是这样吗?有没有办法使用 long、float、int 属性类型?
Gremlin.NET 当然支持数字类型的序列化。但是,TinkerPop 有自己的序列化格式,其中之一是 Cosmos DB 也支持的基于 JSON 的 GraphSON 格式。GraphSON 基本上将所有内容序列化为 JSON 中的对象,该对象由类型键和值组成。因此,一个整数将像这样被序列化:
{
"@type" : "g:Int32",
"@value" : 100
}
这个类型标识符是在 GraphSON 2 中添加的,并且只用于 GraphSON 3 中的所有类型。GraphSON 2 仍然序列化了一些没有这个类型标识符的类型。该GraphSON 2规范描述了这个是这样的:
使用 GraphSON 2.0,基本上有两种类型格式:
假定为 JSON 隐含的类型的非类型化值。这些非类型仅限于 String、Boolean、Map 和 Collection。
所有其他值都通过定义@typeId 和@value 的“复杂对象”进行类型化。
如您所见,数字类型并未列为没有类型标识符的类型。
Cosmos DB 文档提到他们只支持 GraphSON 2,但看起来他们序列化了没有这个类型标识符的数字类型。这曾经适用于 Gremlin.NET 版本 < 3.5.0,因为它仍然具有反序列化没有类型标识符的数字类型的逻辑。这只是 GraphSON 1 格式的剩余部分,没有这些类型标识符。
Gremlin.NET 3.5.0 对 JSON 序列化进行了重大更改,主要是由于从 Newtonsoft.JSON 切换到 System.Text.Json,并且此逻辑作为该更改的一部分被删除。因此,在 Cosmos DB 修复其序列化之前,您似乎需要继续使用 Gremlin.NET 3.4。