ApacheIgnite2.0Java和.NET:BasicBinaryIdMapper不再工作了?

ApacheIgnite2.0Java和.NET:BasicBinaryIdMapper不再工作了?,java,c#,caching,ignite,Java,C#,Caching,Ignite,我的目标是运行一个Java Ignite节点,并让一个.NET客户端连接到该节点。因为我遇到了一些问题,所以我选择了一个更简单的示例,不是服务器/客户机模型,而是服务器/服务器模型。在Ignite 2.0之前,您可以在Java端设置二进制配置,如下所示: // Configure Ignite to connect with .NET nodes BinaryConfiguration binCfg = new BinaryConfiguration(); binCfg.setIdMapper

我的目标是运行一个Java Ignite节点,并让一个.NET客户端连接到该节点。因为我遇到了一些问题,所以我选择了一个更简单的示例,不是服务器/客户机模型,而是服务器/服务器模型。在Ignite 2.0之前,您可以在Java端设置二进制配置,如下所示:

// Configure Ignite to connect with .NET nodes
BinaryConfiguration binCfg = new BinaryConfiguration();

binCfg.setIdMapper(new BinaryBasicIdMapper());
binCfg.setNameMapper(new BinaryBasicNameMapper());
这适用于以下示例项目:

但是,如果您将这两个工作项目从Ignite 1.7.0升级到Ignite 2.0.0,您现在将得到以下异常(来自Java方面):

导致原因:class org.apache.ignite.spi.ignite异常:本地节点的二进制配置不等于远程节点的二进制配置[locNodeId=2d98d083-859f-4bae-bb9a-16fe00f9f39a,rmtNodeId=d9f68030-79b1-4e41-bd00-1bec44dca9e3,locBinaryCfg={globIdMapper=org.apache.ignite.binary.binarybasidMapper,compactFooter=true,globSerializer=null},rmtBinaryCfg={globIdMapper=null,compactFooter=true,globSerializer=null}]

您会注意到,在上述异常中,Java节点具有BinaryBasicId映射器设置,但是远程.NET节点不再具有此映射器,这导致了此异常

我尝试了以下方法,但没有效果:

  • 删除BinaryBasicIdMapper(可以连接到集群,但不能反序列化对象,这是一个“未知对”异常)
  • 使用true参数创建BinaryBasicNameMapper(以启用简单名称)。与上面相同的“未知对”异常

我一直在浏览Ignite文档,试图找出在Ignite 2.0中应该做什么,但我找不到任何例子。还有其他人遇到过这个问题吗?您是如何解决的?

要在Ignite 2.0+中加入Java和.NET节点并将类型映射到彼此:

  • BinaryBasicNameMapper
    与两侧的
    SimpleName
    一起使用
  • 不要设置
    IdMapper
  • 使用
    ignite.binary().type(Foo.class)
    (Java)和
    ignite.GetBinary().GetBinaryType(typeof(Foo))
    (.NET)在两侧注册类型

详情:

Ignite.NET 2.0+采用与Java以前相同的动态类型注册。启动节点之前,无需在BinaryConfiguration中注册类型。通常,您根本不需要注册类型(就像我们在GetBinaryType调用中所做的那样)-类型在首次使用时自动注册。但是,当涉及多个平台时,您可以获得此“未知对”异常,因为每个平台在一个单独的数据结构中注册类型。为什么?因为在反序列化时Ignite需要实例化一个实际的类。在.NET中,这个类可能是
Foo.Bar.Message
,在Java
org.Foo.Bar.Message
中。因此,即使这两个类映射到相同的Ignite二进制类型(简单名称映射器丢弃名称空间/包),在反序列化时,我们需要知道完全限定的名称


我已经更新了有问题的,并在

中添加了工作示例,谢谢Pavel,这很有效!现在我只需要尝试在配置类型样式中找到这样做的方法,以便于更新。我们的应用程序有很多类型:)。接受这个答案。@elumous您也可以通过
IgniteConfiguration.BinaryConfiguration
注册所有类型,这可以用XML完成。但是,您必须在所有节点上提供相同的Java
BinaryConfiguration
,包括.NET,其中通过
IgniteConfiguration.SpringConfigUrl
完成。请告诉我f您需要这方面的帮助。太好了,谢谢您的指针!我能够区分出两种配置(一种用于Java,另一种用于.NET)并且能够在二进制配置中定义类型。我认为这会很好地工作!请注意,即使您已经在ignite.xml中使用了带有SimpleName的BinaryBasicNameMapper,您仍然需要在C#中指定它。