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。


以上是Gremlin.NET反序列化数字属性的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>