Нещодавно брат Шуан захотів спробувати формат розробника публічного акаунта WeChat і подав заявку на відкриття акаунта на публічній платформі WeChat. Потім я пішов подивитися гайд по інтерфейсу відкритої платформи, він додав посилання в групі, WeChat останнім часом перегрівся, я теж з цікавістю натиснув.
Натисніть на гайд інтерфейсу повідомлень, і ми побачимо, що інтерфейс повідомлень публічної платформи використовує XML для взаємодії з даними. Для зручності обробки даних ми зазвичай серіалізуємо та десеріалізуємо XML. Серіалізація — це процес перетворення стану об'єкта у формат, який можна підтримувати або передавати. Протилежністю серіалізації є десеріалізація, яка перетворює потоки на об'єкти. Ці два процеси поєднуються для спрощення зберігання та передачі даних.
Давайте спочатку поговоримо про серіалізацію, візьмемо XML-формат відповіді на графічні повідомлення як приклад, оскільки цей формат фактично включає всі вищезгадані push повідомлення та відповідь на повідомлення.
Коли <xml><Articles>ми отримуємо відповідь на дані від публічної платформи POST для повернення результату, ми використовуємо XML-серіалізацію, тобто для конвертації об'єкта даних відповіді у формат даних XML, який надає публічна платформа, що зручно для передачі даних. Серіалізація Тут я написав простий приклад коду на C#. Щоб отримати серіалізований рядок, Прямого виходу немає, звісно, у вашому проєкті можна безпосередньо Response.Output.
Тут зазначено, що ім'я кореневого елемента XML, згенерованого методом серіалізації класу XmlSerializer, за замовчуванням відповідає назві класу серіалізації. Чому я відчуваю себе таким заплутаним, коли читаю це речення? І я не хочу використовувати беззмістовне слово, як xml, як назву класу, нам потрібно додати тег властивості до класу серіалізації [XmlRoot(ElementName = "xml")], щоб вказати, що згенерований XML-елемент називається xml. Якщо ви не додаєте цей тег, якщо ім'я класу серіалізації не відповідає імені кореневого елемента XML, ви завжди отримаєте помилку формату документа.
Після отримання кореневого елемента потрібно розв'язати проблему вузла збору статей, на цьому етапі потрібно створити новий список сильних типів, і змінна називається публічною власністю статей.
XmlArrayItemAttribute — це похідний тип, який визначає, що XmlSerializer можна розмістити у серіалізованому масиві. Після створення класу, налагодження та перегляду майже немає великої проблеми.
Давайте поговоримо про десеріалізацію. Коли звичайний користувач WeChat надсилає повідомлення на публічний акаунт, сервер WeChat ПУБЛІКУЄ повідомлення на заповненій URL. Наразі нам потрібно десеріалізувати отримані дані у ті об'єкти, які нам потрібні для зручної роботи та зберігання. Зазвичай ми використовуємо Request.Form["param"], щоб отримати дані Post, і багато розробників виявляють, що дані POST не мають параметрів, переглядаючи документацію інтерфейсу, і вони плутаються та не знають, як їх отримати. Тут ми використовуємо Request.InputStream для отримання вмісту вхідного тіла HTTP-сутності. Для отримання додаткової інформації, будь ласка, ознайомтеся з цією статтею: http://blog.sina.com.cn/s/blog_9fa44b550101ee3r.html
Десеріалізація Тут я написав простий приклад коду на C#.
Тут, оскільки це рядок, який безпосередньо копіює xml-зразки даних, що відповідають на графічне повідомлення, використовується перевантаження Deserialize (TextReader textReader), звісно, ви можете безпосередньо використовувати перевантаження Deserialize (поток потоку) у проєкті.
Для запитань щодо серіалізації XML дивіться цю статтю на MSDN про XML та SOAP-серіалізацію
Я розмістив відповідний файл коду екземпляру на github у XmlSerializerExample
Пишіть поспіхом і просто залиште позначок. Я не їв достатньо вночі і тепер відчуваю нудоту. Мені треба швидко лягати спати. Якщо є якісь помилки, будь ласка, виправте їх.
Оригінальне посилання:
http://imr3.com/tech/weixin-message-api-serialize
|