Визуальная электроника

В предидущих статьях мы показали, как программа написанная на C# может обмениваться данными с использованием интерфейсов ETHERNET и последовательный порт. При обмене данными с устройствами, часто возникает необходимость в преобразовании произвольных данных в поток байт. А так-же в обратной операции- преобразовании потока байт в исходные данные. Такие операции называются сериализация и десериализация.

Сериализация — это процесс перевода структуры данных в последовательность битов, или же в другую структуру данных, которую удобно хранить, передавать.

Десериализация — это обратный процесс. Процесс преобразования сериализованных данных в структуру данных.

Рассмотрим эти действия на примере формата JSON.

Сериализация

В данном примере мы рассмотрим библиотеку «Newtonsoft.Json» для работы с JSON. Почему её? Потому что она удобная.

Для начала её нужно установить. Проще всего это сделать с помощью консоли диспетчера пакетов NuGet. Выбираем пункт меню

Средства->Диспетчер пакетов NuGet->Консоль диспетчера пакетов.

pic1

В консоли нужно выполнить команду:

C# Code:
  1. Install-Package Newtonsoft.Json

Ход выполнения установки компонента:

pic1

Теперь можно приступить к коду.

Для начала нужно добавить NameSpace библиотеки в код. Для этого добавим в using следующую строку:

C# Code:
  1. using System;
  2. // Далее ваши библиотеки
  3. using Newtonsoft.Json;

Теперь нужно описать класс, который будем сериализовать и десериализовать:

C# Code:
  1. //Класс всех устройств системы
  2. class Devices
  3. {
  4. public Ans_Device[] Ans_Device { get; set; }
  5. }
  6.  
  7. //Класс ответа девайса
  8. public class Ans_Device
  9. {
  10. public string ANSWER { get; set; }
  11. public string NAME { get; set; }
  12. public int SENSORS { get; set; }
  13. public byte RS485_ADRESS { get; set; }
  14. public int[] IP_ADDRESS { get; set; }
  15. public int[] NETMASK { get; set; }
  16. public int[] GATEWAY { get; set; }
  17. }

Теперь добавим несколько устройств:

C# Code:
  1. Devices myDevices = new Devices();
  2. myDevices.Ans_Device = new Ans_Device[3];
  3.  
  4. myDevices.Ans_Device[0] = new Ans_Device()
  5. {
  6. ANSWER = "SET_1",
  7. NAME = "VE-MS001",
  8. SENSORS = 5,
  9. RS485_ADRESS = 15,
  10. IP_ADDRESS = new int[4] { 192, 168, 1, 200 },
  11. NETMASK = new int[4] { 255, 255, 255, 0 },
  12. GATEWAY = new int[4] { 192, 168, 1, 1 }
  13. };
  14.  
  15. myDevices.Ans_Device[1] = new Ans_Device()
  16. {
  17. ANSWER = "SET_2",
  18. NAME = "VE-MS002",
  19. SENSORS = 5,
  20. RS485_ADRESS = 16,
  21. IP_ADDRESS = new int[4] { 192, 168, 1, 201 },
  22. NETMASK = new int[4] { 255, 255, 255, 0 },
  23. GATEWAY = new int[4] { 192, 168, 1, 1 }
  24. };
  25.  
  26. myDevices.Ans_Device[2] = new Ans_Device()
  27. {
  28. ANSWER = "SET_3",
  29. NAME = "VE-MS003",
  30. SENSORS = 5,
  31. RS485_ADRESS = 17,
  32. IP_ADDRESS = new int[4] { 192, 168, 1, 202 },
  33. NETMASK = new int[4] { 255, 255, 255, 0 },
  34. GATEWAY = new int[4] { 192, 168, 1, 1 }
  35. };

Теперь сериализуем этот класс и выведем на TextBox:

C# Code:
  1. string serialized = JsonConvert.SerializeObject(myDevices);
  2. textBox1.Text = serialized;

В результате чего мы должны получить такую строку на выходе:

Java Code:
  1. {"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:
  1. string json = textBox1.Text;
  2. Devices myDevices = JsonConvert.DeserializeObject(json);

Теперь выведем на экран содержимое десериализованного JSON’а:

C# Code:
  1. textBox5.Text = "Всего устройств добавлено: " + myDevices2.Ans_Device.Length + Environment.NewLine;
  2. foreach (var device in myDevices2.Ans_Device)
  3. {
  4. textBox5.Text += device.ANSWER + " Имя=" +
  5. device.NAME + " Сенсоров=" +
  6. device.SENSORS + " Адрес RS485=" +
  7. device.RS485_ADRESS + " Сеть адрес=" +
  8. device.IP_ADDRESS[0] + "." +
  9. device.IP_ADDRESS[1] + "." +
  10. device.IP_ADDRESS[2] + "." +
  11. device.IP_ADDRESS[3] + "." + " Сеть маска=" +
  12. device.NETMASK[0] + "." +
  13. device.NETMASK[1] + "." +
  14. device.NETMASK[2] + " " +
  15. device.NETMASK[3] + " " + " Сеть шлюз=" +
  16. device.GATEWAY[0] + "." +
  17. device.GATEWAY[1] + "." +
  18. device.GATEWAY[2] + "." +
  19. device.GATEWAY[3] + ";" +
  20. Environment.NewLine;
  21. }

На экран должно вывестись следующий текст:

Text Code:
  1. Всего устройств добавлено: 3
  2. SET_1 Имя=VE-MS001 Сенсоров=5 Адрес RS485=15 Сеть адрес=192.168.1.200. Сеть маска=255.255.255 0 Сеть шлюз=192.168.1.1;
  3. SET_2 Имя=VE-MS002 Сенсоров=5 Адрес RS485=16 Сеть адрес=192.168.1.201. Сеть маска=255.255.255 0 Сеть шлюз=192.168.1.1;
  4. 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), но никто не мешает вам его переименовать в нужный.

Добавить комментарий