Apache Geode .NET原生客户端执行连续查询时遇序列化异常
解决Apache Geode .NET客户端连续查询"Got unhandled message type 26"异常
这个错误Got unhandled message type 26通常是因为协议消息不兼容或者序列化配置不匹配导致的,结合你的场景(存储简单字符串、常规查询正常),我整理了几个针对性的解决思路:
1. 优先检查Java服务端和.NET客户端的Geode版本一致性
Geode的Java服务端和Native .NET客户端的版本必须完全一致(比如都是1.15.0、1.16.0),版本不匹配会导致协议消息类型不识别——这是触发message type 26错误最常见的原因。
- 确认Java服务端的Geode版本(比如看pom.xml/gradle依赖)
- 确认.NET客户端的
Apache.GeodeNuGet包版本和服务端完全一致
2. 移除不必要的PDX序列化配置(针对字符串场景)
你存储的是简单字符串,Geode原生支持基本类型的序列化,不需要PDX。当前两端的PDX配置反而可能导致序列化冲突:
服务端修改:
- 删除
cache.xml中的<pdx>整个配置块 - 移除Java代码中的
.setPdxReadSerialized(true)
.NET客户端修改:
- 移除
CacheFactory中的.SetPdxReadSerialized(true).SetPdxIgnoreUnreadFields(true) - 删掉
cache.TypeRegistry.PdxSerializer = new ReflectionBasedAutoSerializer();这一行
3. 修正连续查询的类型匹配问题
你的Region是<string, string>,但连续查询相关的对象用了<string, object>,类型不匹配会导致序列化解析失败:
.NET客户端连续查询代码修改:
// 修正泛型类型为<string, string>,和Region一致 CqAttributesFactory<string, string> cqAttribsFactory = new CqAttributesFactory<string, string>(); ICqListener<string, string> listener = new CacheListener<string, string>(); cqAttribsFactory.InitCqListeners(new ICqListener<string, string>[] { listener }); CqAttributes<string, string> cqAttribs = cqAttribsFactory.Create(); CqQuery<string, string> cquery = qs.NewCq<string, string>("select * from /example_region", cqAttribs, false);
对应的CacheListener实现调整:
确保Listener的泛型参数和Region匹配,避免类型转换错误:
public class CacheListener<TKey, TResult> : ICqListener<TKey, TResult> { public virtual void OnEvent(CqEvent<TKey, TResult> ev) { // 直接使用TResult类型,不需要强制转object TResult val = ev.getNewValue(); TKey key = ev.getKey(); CqOperation opType = ev.getQueryOperation(); string opStr = opType switch { CqOperation.OP_TYPE_CREATE => "CREATE", CqOperation.OP_TYPE_UPDATE => "UPDATE", _ => "DESTROY" }; Console.WriteLine("MyCqListener::OnEvent called with key {0}, op {1}, value {2}.", key, opStr, val); } // 其余方法保持不变 public virtual void OnError(CqEvent<TKey, TResult> ev) => Console.WriteLine("MyCqListener::OnError call"); public virtual void Close() => Console.WriteLine("MyCqListener::Close call"); }
4. 确保服务端Region支持订阅功能
连续查询依赖Geode的订阅机制,需要给Region开启订阅支持:
修改服务端cache.xml的Region配置:
<region name="example_region"> <region-attributes refid="REPLICATE"> <!-- 开启订阅支持 --> <subscription-enabled>true</subscription-enabled> </region-attributes> </region>
5. 验证客户端Pool配置
确认.NET客户端的Pool配置正确指向服务端的cache-server端口(你服务端配置的是40404),比如客户端的cache.xml中Pool的配置应该类似:
<pool name="serverPool"> <server host="localhost" port="40404"/> </pool>
按照以上步骤逐一排查后,重新启动服务端和客户端,连续查询应该可以正常运行。
内容的提问来源于stack exchange,提问作者Eluamous
相关产品推荐
相关产品推荐

