Zu Beginn ist erwähnenswert, dass Serialisierung und Deserialisierung von Bond Nachrichten innerhalb einer einzelnen F # -Lösung funktioniert. Ich habe jedoch Probleme, das Senden und/oder Empfangen der Nachricht über ZeroMQ richtig zu handhaben.Laufzeit "EndOfStreamException" Fehler in MS Bond Serialisierung über ZeroMQ
Es liegt ein Laufzeitfehler auf der Teilnehmerseite des folgenden Programms vor. Eine .bond-Datei wird mit dem Bond-Compiler definiert und kompiliert. Dann wird eine DLL von C# erstellt, um von F # aufgerufen zu werden. Ich habe dann zwei F # -Programme. Eine, die serialisierte Daten über einen TCP-Socket und einen anderen, der ein Abonnent ist, veröffentlicht. Wenn die Nachricht auf der Unterstation empfangen wird, ist die Zeile, die versucht, die Rohdaten zu unmarshalen, diejenige, die den Laufzeitfehler verursacht. Kann jemand den Grund dafür sehen?
[EDIT] Per Fyodor Kommentar, habe ich eine Änderung auf der Publisher-Seite, die den Fehler auf der Teilnehmerseite ändert. Der Fehler hat wahrscheinlich etwas damit zu tun, wie ich die Informationen packe und entpacke.
Dies ist die .bond Datei
namespace Examples
struct Record
{
0: map<string, double> payload;
}
Hier ist der Verlag:
// 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)
Hier wird der Teilnehmer:
// 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
Ich sehe, Sie erstellen ein 'ZFrame' aus' byteArr.ToString() '. Das tut nicht, was du denkst. Versuchen Sie, das Ergebnis von 'byteArr.ToString()' auszudrucken, um zu sehen, was Sie tatsächlich senden. –