使用 hyperion

问题描述

我正在尝试更多地了解 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 (将#修改为@)