问题描述
我正在尝试更多地了解 Akka 框架,特别是我正在使用 C#(.NET 标准 2)开发一个应用程序,该应用程序在共享 Actor 集群中工作。
我发现了一个我无法理解的奇怪问题:当我在参与者之间发送本地 Akka 消息时,只有当消息的类在参与者的 CLR 之外(例如在 DLL 中)定义时,它才会正确序列化。这当然只有在您强制使用设置进行序列化时才会发生:
akka{
actor{
serialize-messages = on
}
}
强制本地消息被序列化而不是作为引用传递。请注意,发布/订阅一切正常。
举个例子,当这种情况发生时,如果我有一个演员想要向它的孩子 Child 发送类 MsgClass 的消息,我会这样做:
Child.Tell(new MsgClass());
在 Child 类中,我注册了这种类型的消息:
Receive<MsgClass>(MessageReceiveMethod);
例如处理方法在哪里:
private void MessageReceiveMethod(MsgClass msg){}
如果 MsgClass 是在与 actor 不同的 DLL 中定义的,则消息会得到正确处理。如果它被定义在同一个可执行文件中,它会被处理:
protected override void Unhandled(object message){}
但是在调试时我检查消息它具有正确的类类型和内容。
作为最后一个细节,这是演员系统的设置方式:
actor {
serialize-messages = on
debug {
receive = on # log any received message
autoreceive = on # log automatically received messages,e.g. PoisonPill
lifecycle = on # log actor lifecycle changes
event-stream = on # log subscription changes for Akka.NET event stream
unhandled = on # log unhandled messages sent to actors
}
provider = "Akka.Cluster.ClusteractorRefProvider,Akka.Cluster"
serializers {
hyperion = "Akka.Serialization.HyperionSerializer,Akka.Serialization.Hyperion"
akka-pubsub = "Akka.Cluster.Tools.PublishSubscribe.Serialization.distributedPubSubMessageSerializer,Akka.Cluster.Tools"
}
serialization-bindings {
"System.Object" = hyperion
"Akka.Cluster.Tools.PublishSubscribe.IdistributedPubSubMessage,Akka.Cluster.Tools" = akka-pubsub
"Akka.Cluster.Tools.PublishSubscribe.Internal.SendToOnesubscriber,Akka.Cluster.Tools" = akka-pubsub
}
serialization-identifiers {
"Akka.Cluster.Tools.PublishSubscribe.Serialization.distributedPubSubMessageSerializer,Akka.Cluster.Tools" = 9
}
}
我试图寻找类似的问题,但无法获得任何见解。我真的希望这对我来说是愚蠢的,如果你能在这件事上启发我,我将非常感激。 谢谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)