首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Akka.Remote F#序列化只在受歧视的联合的第一个字段上工作。

Akka.Remote F#序列化只在受歧视的联合的第一个字段上工作。
EN

Stack Overflow用户
提问于 2020-12-02 20:48:21
回答 1查看 267关注 0票数 0

若要向远程参与者发送受歧视的联合字段,我将使用Hyperion作为序列化程序,但它似乎只序列化第一个字段,但不序列化联合的其余部分。示例代码如下:

Server.fsx

代码语言:javascript
复制
#r "nuget: Akka.FSharp" 
#r "nuget: Akka.TestKit"
#r "nuget: Akka.Remote"
#r "nuget: Akka.Serialization.Hyperion"
#load "Message.fsx"

open Message
open System
open Akka.FSharp
open Akka.Remote
open Akka.Configuration
open Akka.Serialization
let configuration = 
    ConfigurationFactory.ParseString(
        @"akka {
            actor {
                provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
                debug : {
                    receive : on
                    autoreceive : on
                    lifecycle : on
                    event-stream : on
                    unhandled : on
                }
                serializers {
                    hyperion = ""Akka.Serialization.HyperionSerializer, Akka.Serialization.Hyperion""
                }
                serialization-bindings {
                    ""System.Object"" = hyperion
                }                
            }
            remote {
                helios.tcp {
                    port = 9002
                    hostname = 192.168.0.94
                }
            }
        }")

let serversystem = System.create "Server" configuration



let server (mailbox:Actor<_>) =
    let rec loop () = actor {
        let! message = mailbox.Receive()
        match message with
        | Message(num, num1, str) -> printfn "Got a number %d %d %s" num num1 str
        | CreateDone(num, num1, str) -> printfn "Got a create %d %d %s" num num1 str
    }
    loop ()

let serveRef = spawn serversystem "server" server
Console.ReadLine() |> ignore

Client.fsx

代码语言:javascript
复制
#r "nuget: Akka.FSharp" 
#r "nuget: Akka.TestKit"
#r "nuget: Akka.Remote"
#r "nuget: Akka.Serialization.Hyperion"
#load "Message.fsx"

open Message
open System
open Akka.FSharp
open Akka.Remote
open Akka.Configuration
open Akka.Serialization

let configuration = 
    ConfigurationFactory.ParseString(
        @"akka {
            actor {
                provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
                serializers {
                    hyperion = ""Akka.Serialization.HyperionSerializer, Akka.Serialization.Hyperion""
                }
                serialization-bindings {
                    ""System.Object"" = hyperion
                }               
            }
            remote {
                helios.tcp {
                    port = 2552
                    hostname = localhost
                }
            }
        }")

let clientSystem = System.create "client" configuration

let serveRef = select ("akka.tcp://Server@192.168.0.94:9002/user/server") clientSystem
serveRef <! Message(10L, 20, "Hello")
serveRef <! CreateDone(10L, 20, "Hi")
Console.ReadLine()

Message.fsx

代码语言:javascript
复制
type Message = Message of int64 * int * string
              | CreateDone of int64 * int * string

服务器的输出是:

代码语言:javascript
复制
F:\UF\Courses\FALL2020\DOS\Projects\Project4.1>dotnet fsi --langversion:preview serve.fsx
[INFO][12/2/2020 1:42:13 AM][Thread 0001][remoting (akka://Server)] Starting remoting
[INFO][12/2/2020 1:42:13 AM][Thread 0001][remoting (akka://Server)] Remoting started; listening on addresses : [akka.tcp://Server@192.168.0.94:9002]
[INFO][12/2/2020 1:42:13 AM][Thread 0001][remoting (akka://Server)] Remoting now listens on addresses: [akka.tcp://Server@192.168.0.94:9002]
Got a number 10 20 Hello

因此,似乎只有第一个字段在受歧视的联合中被序列化。如何克服这一问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-02 21:29:41

您的演员没有循环,所以在第一条消息之后终止

添加

代码语言:javascript
复制
return! loop()

在递归循环中。

我觉得这个问题有点混乱。它说明第一个字段是打印的,但是所有字段都在打印输出中。我想你是说第一条消息

c#示例中的Akka不需要循环,但是Akka.fsharp与MailboxProxessor语法匹配,因此需要显式循环。

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

https://stackoverflow.com/questions/65115900

复制
相关文章

相似问题

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