使用Akka.FSharp在远程Actor间发送Record报SerializationException如何解决
问题根因
你遇到的报错核心原因是服务端、客户端各自独立定义了Message联合类型,两个类型虽然结构、名称完全一致,但分别属于Client和Server两个不同的程序集。客户端发送消息时序列化的是Client程序集下的Message类型,服务端反序列化时会尝试加载Client程序集查找对应类型,自然抛出找不到程序集的异常。
该问题和你使用的Hyperion序列化器本身无关,是类型定义不统一导致的。
解决方案
方案1:抽取公共消息类库(最推荐,生产环境通用方案)
- 新建一个单独的.NET类库项目(命名比如
AkkaSample.Messages),将消息类型统一定义在这个项目中,注意加上固定的命名空间:
namespace AkkaSample.Messages type Message = | TestMessage of int
- 服务端、客户端项目都引用这个公共类库项目,删除两端各自定义的
Message类型,统一使用open AkkaSample.Messages引入公共消息类型。 - 确保服务端、客户端引用的所有Akka相关包、Hyperion序列化包的版本完全一致。
方案2:开启Hyperion跨程序集序列化适配(适合临时测试,不推荐生产用)
如果不想抽公共类库,可以修改两端的Hyperion配置,开启跨程序集类型匹配支持,允许同名称、同结构的类型跨程序集解析:
akka { actor { provider = "Akka.Remote.RemoteActorRefProvider, Akka.Remote" serializers { hyperion = "Akka.Serialization.HyperionSerializer, Akka.Serialization.Hyperion" } serialization-bindings { "System.Object" = hyperion } serialization-settings { hyperion { cross-platform-serialization = true ignore-unknown-fields = true } } } remote { helios.tcp { # 两端各自的端口配置保持不变 hostname = localhost } } }
注意:该方案只适合快速测试,生产环境下类型定义分散在两端容易出现结构不一致导致的序列化BUG,优先选择方案1。
额外检查项
- 你当前配置中把Hyperion序列化器命名为
json容易引发混淆,建议修改为hyperion和官方命名对齐,避免后续配置出错。 - 确认服务端Actor路径拼写正确,你的代码中服务端spawn的Actor名称是
ServerActor,客户端select的路径也是user/ServerActor,路径本身没有问题。
内容的提问来源于stack exchange,提问作者Amar Pawar
相关产品推荐
相关产品推荐

