首先,值得一提的是,在单个 F# 解决方案中,Bond消息的序列化和反序列化工作正常。但是,我无法正确处理通过 ZeroMQ 发送和/或接收消息。
以下程序的订阅方存在运行时错误。.bond 文件是使用bond 编译器定义和编译的。然后从 C# 创建一个 dll 以从 F# 调用。然后我有两个 F# 程序。一个通过 tcp 套接字发布序列化数据,另一个是订阅者。当在 sub 上接收到消息时,尝试 Unmarshal 原始数据的行是导致运行时错误的行。任何人都可以看到这个的原因吗?
[编辑] 根据 Fyodor 的评论,我在发布者方面进行了更改,从而更改了订阅者方面的错误。所以这个错误可能与我如何打包和解包信息有关。
这是 .bond 文件
namespace Examples
struct Record
{
0: map<string, double> payload;
}
这是发布者:
// publisher
open System
open Bond
open Bond.Protocols
open Bond.IO.Safe
open ZeroMQ
let ctx = new ZContext()
let publisher = new ZSocket(ctx, ZSocketType.PUB)
publisher.Bind("tcp://*:5556")
let src = new Examples.Record()
src.payload.Add("a", 1.)
src.payload.Add("b", 2.)
let output = new OutputBuffer()
let writer = new CompactBinaryWriter<OutputBuffer>(output)
while true do
Marshal.To(writer, src)
//let input = new InputBuffer(output.Data)
//let byteArr = input.ReadBytes(int(input.Length - 1L))
let updateFrame = new ZFrame(System.Text.Encoding.ASCII.GetString output.Data.Array)
publisher.Send(updateFrame)
这是订户:
// subscriber
open Bond
open Bond.Protocols
open Bond.IO.Safe
open System
open System.Text
open ZeroMQ
let ctx = new ZContext()
let subscriber = new ZSocket(ctx, ZSocketType.SUB)
subscriber.Connect("tcp://127.0.0.1:5556")
subscriber.SubscribeAll()
let output = new OutputBuffer()
while true do
let received = subscriber.ReceiveFrame()
let byteArr = Encoding.ASCII.GetBytes (received.ReadString())
let arrSeg = ArraySegment<byte>(byteArr)
let input = new InputBuffer(arrSeg)
let dst = Unmarshal<Examples.Record>.From(input)
for KeyValue(k, v) in dst.payload do
printfn "%A %A" k v