首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SerializationException同时使用Akka.FSharp在远程参与者之间发送记录

SerializationException同时使用Akka.FSharp在远程参与者之间发送记录
EN

Stack Overflow用户
提问于 2021-11-27 16:46:40
回答 1查看 170关注 0票数 1

我试图在Akka.FSharp中的远程参与者之间发送一条记录消息,但是我得到了下面的序列化异常。

代码语言:javascript
复制
[WARNING][27-11-2021 16:37:25][Thread 0025][akka.tcp://Server@localhost:8001/system/endpointManager/reliableEndpointWriter-akka.tcp%3A%2F%2FClient%40localhost%3A59213-1/endpointWriter/endpointReader-akka.tcp%3A%2F%2FClient%40localhost%3A59213-1] Deserialization failed for message with serializer id [6] and manifest []. Transient association error (association remains live). Failed to deserialize payload object when deserializing ActorSelectionMessage with payload [SerializerId=-5, Manifest=] addressed to [user,serverActor]
Cause: System.Runtime.Serialization.SerializationException: Failed to deserialize payload object when deserializing ActorSelectionMessage with payload [SerializerId=-5, Manifest=] addressed to [user,serverActor]
 ---> System.Runtime.Serialization.SerializationException: Failed to deserialize instance of type . Could not load file or assembly 'Client, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
 ---> System.IO.FileNotFoundException: Could not load file or assembly 'Client, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
File name: 'Client, Culture=neutral, PublicKeyToken=null'
   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, StackCrawlMarkHandle stackMark, ObjectHandleOnStack assemblyLoadContext, ObjectHandleOnStack type, ObjectHandleOnStack keepalive)
   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, StackCrawlMark& stackMark, AssemblyLoadContext assemblyLoadContext)
   at System.RuntimeType.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, StackCrawlMark& stackMark)
   at System.Type.GetType(String typeName, Boolean throwOnError)
   at Hyperion.Extensions.TypeEx.LoadTypeByName(String name, Boolean disallowUnsafeTypes)
   at Hyperion.Extensions.TypeEx.<>c__DisplayClass28_0.<GetTypeFromManifestName>b__0(ByteArrayKey b)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at Hyperion.Extensions.TypeEx.GetTypeFromManifestName(Stream stream, DeserializerSession session)
   at Hyperion.Extensions.TypeEx.GetTypeFromManifestVersion(Stream stream, DeserializerSession session)
   at Hyperion.Serializer.Deserialize[T](Stream stream)
   at Akka.Serialization.HyperionSerializer.FromBinary(Byte[] bytes, Type type)
   --- End of inner exception stack trace ---
   at Akka.Serialization.HyperionSerializer.FromBinary(Byte[] bytes, Type type)
   at Akka.Serialization.Serialization.Deserialize(Byte[] bytes, Int32 serializerId, String manifest)
   at Akka.Remote.Serialization.WrappedPayloadSupport.PayloadFrom(Payload payload)
   at Akka.Remote.Serialization.MessageContainerSerializer.FromBinary(Byte[] bytes, Type type)
   --- End of inner exception stack trace ---
   at Akka.Remote.Serialization.MessageContainerSerializer.FromBinary(Byte[] bytes, Type type)
   at Akka.Serialization.Serialization.Deserialize(Byte[] bytes, Int32 serializerId, String manifest)
   at Akka.Remote.MessageSerializer.Deserialize(ExtendedActorSystem system, Payload messageProtocol)
   at Akka.Remote.DefaultMessageDispatcher.Dispatch(IInternalActorRef recipient, Address recipientAddress, Payload message, IActorRef senderOption)
   at Akka.Remote.EndpointReader.<Reading>b__11_0(InboundPayload inbound)

下面是我为两个远程角色编写的代码。

服务器:

代码语言:javascript
复制
open System
open Akka
open Akka.FSharp

type Message = 
    | TestMessage of (int)

[<EntryPoint>]
let main argv =
    
    let serverConfig() = Configuration.parse("""
    akka {
        actor {
            provider = "Akka.Remote.RemoteActorRefProvider, Akka.Remote"
            serializers {
                json = "Akka.Serialization.HyperionSerializer, Akka.Serialization.Hyperion"
            }
            serialization-bindings {
                "System.Object" = json
            }
        }
        remote {
            helios.tcp {
                port = 8001
                hostname = localhost
            }
        }
    }
    """)

    let serverSystem = serverConfig() |> System.create "Server"
    
    let serverActor (mailbox: Actor<Message>) = 
        let rec loop() = actor {
            let! message = mailbox.Receive()
            
            match message with
            | TestMessage(num) ->
                printfn "%d" num
            return! loop()
        }
        loop()

    spawn serverSystem "ServerActor" serverActor |> ignore

    Console.ReadLine() |> ignore

    0 // return an integer exit code

客户端:

代码语言:javascript
复制
open System
open Akka
open Akka.FSharp

type Message = 
    | TestMessage of (int)

[<EntryPoint>]
let main argv =

    let clientConfig() = Configuration.parse("""
    akka {
        actor {
            provider = "Akka.Remote.RemoteActorRefProvider, Akka.Remote"
            serializers {
                json = "Akka.Serialization.HyperionSerializer, Akka.Serialization.Hyperion"
            }
            serialization-bindings {
                "System.Object" = json
            }
        }
        remote {
            helios.tcp {
                port = 0
                hostname = localhost
            }
        }
    }
    """)

    let clientSystem = clientConfig() |> System.create "Client"
    let serverActorRef = select ("akka.tcp://Server@localhost:8001/user/ServerActor") clientSystem
    serverActorRef <! Message.TestMessage(0)

    Console.ReadLine() |> ignore

    0 // return an integer exit code

我已经配置了Akka.Serialization.Hyperion,但仍然得到了相同的异常。不知道我在这里做错了什么。任何帮助都是徒劳无功。

EN

回答 1

Stack Overflow用户

发布于 2022-01-31 18:19:27

您已经在两个地方声明了消息,并且应该使用点-netty.tcp,就像Bent Tranberg所建议的那样。下面是一个有效解决方案的屏幕截图:

我就是这样做的:

shared!

  • Replaced

  • i将TestMessage移到一个公共类库中,使其成为Akka.Serialization.Hyperion

的最新版本--Akka.Serialization.Hyperion的最新版本

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70136831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档