Чтобы начать, стоит упомянуть, что в рамках одного решения F # сериализация и десериализация сообщений Bond работает нормально. Однако у меня возникают проблемы с правильной обработкой отправки и/или получения сообщения через ZeroMQ.Ошибка выполнения «EndOfStreamException» в сериализации MS Bond над ZeroMQ
На стороне абонента следующей программы есть ошибка времени выполнения. Файл .bond определяется и компилируется с помощью компилятора связей. Затем dll создается из C# для вызова из F #. Затем у меня есть две программы F #. Один, который публикует сериализованные данные через сокет tcp и другой, который является подписчиком. Когда сообщение получено на суб, линия, которая пытается Unmarshal необработанных данных, является той, которая вызывает ошибку времени выполнения. Может ли кто-нибудь увидеть причину этого?
[EDIT] Комментарий от пользователя 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
Я вижу, что вы создаете 'ZFrame' из' byteArr.ToString() '. Это не делает то, что вы думаете. Попробуйте распечатать результат 'byteArr.ToString()', чтобы узнать, что вы действительно отправляете. –