Signalr отправляет вложенный словарь ключей/значений

Я определил тип в С#, называемый

using Message = System.Collections.Generic.Dictionary<string, object>;

У меня нет проблем с отправкой этого с сервера С# на клиент С#.

Но теперь они хотят, чтобы одна из пар значений была массивом Message, как показано ниже (переменная tracked с фиктивными значениями):

        Message msg = new Message();
        msg.Add("timestamp", Tools.ToMS(seconds, microseconds));
        msg.Add("DateTime", Tools.ToISO(this.seconds, this.microseconds));
        msg.Add("guid", Guid.NewGuid().ToString());
        msg.Add("heading", this.heading);
        msg.Add("correction", this.correction);
        msg.Add("valid", this.valid);
        msg.Add("lat", lat);
        msg.Add("lon", lon);
        msg.Add("altitude", altitude);
        msg.Add("Channel", "Oxford.GPS");

        Message[] tracked = new Message[2];
        tracked[0] = new Message();
        tracked[1] = new Message();
        tracked[0].Add("first", 1);
        tracked[1].Add("second", 2);
        msg.Add("tracked", tracked);
        return msg;

Хорошо, я не получаю ошибок при отправке, но на принимающей стороне встроенный словарь не преобразуется в словарь, вместо этого я получаю массив Newtonsoft.Json.Linq.JArray

     Type: Object
HasValues: 1
    First: [1x1 Newtonsoft.Json.Linq.JProperty]
     Last: [1x1 Newtonsoft.Json.Linq.JProperty]
    Count: 1
   Parent: [1x1 Newtonsoft.Json.Linq.JArray]
     Root: [1x1 Newtonsoft.Json.Linq.JArray]
     Next: [1x1 Newtonsoft.Json.Linq.JObject]
 Previous: []
     Path: [1x1 System.String]

Вот что показывает детальная трассировка, прибывающая к клиенту, что выглядит хорошо на мой неопытный взгляд:

{"C":"d-4A172629-B,5549|C,0|D,1","M":[{"H":"GatewayHub","M":"post","A":[{"timestamp":1450469910308,"DateTime":"2015-12-18T20:18:30.3090000Z","guid":"60ef4307-1225-40f9-b0e0-f2f1d87e760d","heading":210.340958,"correction":3,"valid":true,"lat":42.299856271140619,"lon":-83.698864895162188,"altitude":269.147216796875,"Channel":"Oxford.GPS","tracked":[{"first":1},{"second":2}]}]}]})

Да, хотите верьте, хотите нет, но потом я отправляю это через событие в Matlab, что тоже работает, но не для вложенных значений.


person Dr.YSG    schedule 08.04.2016    source источник
comment
Вы можете попробовать это: stackoverflow.com/questions/32314638/signalr-typenamehandling   -  person dbc    schedule 08.04.2016


Ответы (1)


Поскольку моя цель - просто передать значения из драйвера датчика (написанного в виде dll) из поля «сервер» -> клиент Matlab на отдельной машине, я изменил способ, которым я это делаю.

Я беру значение двоичной структуры, использую динамический тип C# и передаю его в JSON.NET внутри SignalR. Это делает достаточно эффективное кодирование.

Тогда я могу сделать:

        proxy.On<string, dynamic>("post2", (chan, pkt) =>
        {
            Console.WriteLine("channel: " + chan);
            pkt.channel = chan;
            trigger2(pkt);
        });

и получить данные внутри встроенной dll С# (встроенной в Matlab). Я запускаю событие (последняя строка) и отправляю полный объект JSON.NET в Matlab, который затем может использовать .SelectToken() для получения значений.

Я подумал, что это красиво, можете называть это уродством, и я не буду плакать.

person Dr.YSG    schedule 11.04.2016