В предидущих статьях мы показали, как программа написанная на C# может обмениваться данными с использованием интерфейсов ETHERNET и последовательный порт. При обмене данными с устройствами, часто возникает необходимость в преобразовании произвольных данных в поток байт. А так-же в обратной операции- преобразовании потока байт в исходные данные. Такие операции называются сериализация и десериализация.
Сериализация — это процесс перевода структуры данных в последовательность битов, или же в другую структуру данных, которую удобно хранить, передавать.
Десериализация — это обратный процесс. Процесс преобразования сериализованных данных в структуру данных.
Рассмотрим эти действия на примере формата JSON.
Сериализация
В данном примере мы рассмотрим библиотеку «Newtonsoft.Json» для работы с JSON. Почему её? Потому что она удобная.
Для начала её нужно установить. Проще всего это сделать с помощью консоли диспетчера пакетов NuGet. Выбираем пункт меню
Средства->Диспетчер пакетов NuGet->Консоль диспетчера пакетов.
В консоли нужно выполнить команду:
C# Code:
Install-Package Newtonsoft.Json
Ход выполнения установки компонента:
Теперь можно приступить к коду.
Для начала нужно добавить NameSpace библиотеки в код. Для этого добавим в using следующую строку:
C# Code:
using System; // Далее ваши библиотеки using Newtonsoft.Json;
Теперь нужно описать класс, который будем сериализовать и десериализовать:
C# Code:
//Класс всех устройств системы class Devices { public Ans_Device[] Ans_Device { get; set; } } //Класс ответа девайса public class Ans_Device { public string ANSWER { get; set; } public string NAME { get; set; } public int SENSORS { get; set; } public byte RS485_ADRESS { get; set; } public int[] IP_ADDRESS { get; set; } public int[] NETMASK { get; set; } public int[] GATEWAY { get; set; } }
Теперь добавим несколько устройств:
C# Code:
{ ANSWER = "SET_1", NAME = "VE-MS001", SENSORS = 5, RS485_ADRESS = 15, }; { ANSWER = "SET_2", NAME = "VE-MS002", SENSORS = 5, RS485_ADRESS = 16, }; { ANSWER = "SET_3", NAME = "VE-MS003", SENSORS = 5, RS485_ADRESS = 17, };
Теперь сериализуем этот класс и выведем на TextBox:
C# Code:
string serialized = JsonConvert.SerializeObject(myDevices); textBox1.Text = serialized;
В результате чего мы должны получить такую строку на выходе:
Java Code:
{"Ans_Device":[{"ANSWER":"SET_1","NAME":"VE-MS001","SENSORS":5,"RS485_ADRESS":15,"IP_ADDRESS":[192,168,1,200],"NETMASK":[255,255,255,0],"GATEWAY":[192,168,1,1]},{"ANSWER":"SET_2","NAME":"VE-MS002","SENSORS":5,"RS485_ADRESS":16,"IP_ADDRESS":[192,168,1,201],"NETMASK":[255,255,255,0],"GATEWAY":[192,168,1,1]},{"ANSWER":"SET_3","NAME":"VE-MS003","SENSORS":5,"RS485_ADRESS":17,"IP_ADDRESS":[192,168,1,202],"NETMASK":[255,255,255,0],"GATEWAY":[192,168,1,1]}]}
Десериализация
Теперь нужно эту строку десериализовать обратно в класс. Для этого, естественно, должен быть объявлен соответствующий класс, иначе программа не сможет ничего десериализовать.
Сам код десериализации следующий:
C# Code:
string json = textBox1.Text; Devices myDevices = JsonConvert.DeserializeObject(json);
Теперь выведем на экран содержимое десериализованного JSON’а:
C# Code:
textBox5.Text = "Всего устройств добавлено: " + myDevices2.Ans_Device.Length + Environment.NewLine; foreach (var device in myDevices2.Ans_Device) { textBox5.Text += device.ANSWER + " Имя=" + device.NAME + " Сенсоров=" + device.SENSORS + " Адрес RS485=" + device.RS485_ADRESS + " Сеть адрес=" + device.IP_ADDRESS[0] + "." + device.IP_ADDRESS[1] + "." + device.IP_ADDRESS[2] + "." + device.IP_ADDRESS[3] + "." + " Сеть маска=" + device.NETMASK[0] + "." + device.NETMASK[1] + "." + device.NETMASK[2] + " " + device.NETMASK[3] + " " + " Сеть шлюз=" + device.GATEWAY[0] + "." + device.GATEWAY[1] + "." + device.GATEWAY[2] + "." + device.GATEWAY[3] + ";" + Environment.NewLine; }
На экран должно вывестись следующий текст:
Text Code:
Всего устройств добавлено: 3 SET_1 Имя=VE-MS001 Сенсоров=5 Адрес RS485=15 Сеть адрес=192.168.1.200. Сеть маска=255.255.255 0 Сеть шлюз=192.168.1.1; SET_2 Имя=VE-MS002 Сенсоров=5 Адрес RS485=16 Сеть адрес=192.168.1.201. Сеть маска=255.255.255 0 Сеть шлюз=192.168.1.1; SET_3 Имя=VE-MS003 Сенсоров=5 Адрес RS485=17 Сеть адрес=192.168.1.202. Сеть маска=255.255.255 0 Сеть шлюз=192.168.1.1;
Как видите — с JSON очень удобно работать. Но есть одна маленькая хитрость, которая сильно упростит вашу жизнь при десериализации. Чтобы вам вручную не создавать огромные классы анализируя пример JSON’а, который вам возвращает API — можно его сгенерировать автоматически. В этом вам поможет сайт Json2CSharp. Просто вставьте в него строку с JSON, которую вы получили из API и он сгенерирует вам необходимые классы. Основной класс будет всегда RootObject (в примере был myDevices), но никто не мешает вам его переименовать в нужный.