Gremlin.NET 反序列化数字属性

问题描述

我有一个创建顶点和边“已创建”的查询。边缘有一个属性“on”,它是 unix datetime 长。当我在 Azure Cosmos DB 终端中使用以下段执行查询时,它按预期工作 - 返回一个对象,其“On”属性一个数字。

asp-route-customermodel="@Model.customer"

当我使用 Gremlin.NET 从我的应用程序代码执行此查询时,它失败并显示错误

不支持 JSON 类型。

我看到 in the source code 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 spec 是这样描述的:

对于 GraphSON 2.0,基本上有两种类型格式:

  • 假定为 JSON 隐含类型的非类型化值。这些非类型仅限于 String、Boolean、Map 和 Collection。

  • 所有其他值都是通过定义@typeId 和@value 的“复杂对象”输入的。

如您所见,数字类型并未列为没有类型标识符的类型。

The Cosmos DB docs mention that they only support GraphSON 2,但看起来他们序列化了没有这个类型标识符的数字类型。这曾经适用于 Gremlin.NET 版本

Gremlin.NET 3.5.0 对 JSON 序列化进行了重大更改,主要是由于从 Newtonsoft.JSON 切换到 System.Text.Json,并且此逻辑作为该更改的一部分被删除。 因此,在 Cosmos DB 修复其序列化之前,您似乎需要继续使用 Gremlin.NET 3.4。