Підрозділ 19.Q
Питання для самоконтролю
Питання для самоконтролю — Розділ 19. Серіалізація JSON та XML 19.1. System.Text.Json — розширені можливості 1. Навіщо JsonDocument використовує ArrayPool і чому обов'язковий блок using ? Що відбудеться, якщо н
Питання для самоконтролю — Розділ 19. Серіалізація JSON та XML
19.1. System.Text.Json — розширені можливості
Навіщо
JsonDocumentвикористовуєArrayPoolі чому обов'язковий блокusing? Що відбудеться, якщо не викликатиDispose()наJsonDocument?Розгляньте код:
using var doc = JsonDocument.Parse(jsonString); JsonElement root = doc.RootElement; if (root.TryGetProperty("patient", out JsonElement patient)) { Console.WriteLine(patient.GetProperty("name").GetString()); Console.WriteLine(patient.GetProperty("age").GetInt32()); }Чим
TryGetPropertyвідрізняється відGetProperty? Коли і яке з них використовувати?Перелічіть значення
JsonValueKind. Напишіть методPrintJsonStructure(JsonElement element, int depth), що рекурсивно обходить JSON та виводить структуру з відступами, розрізняючи об'єкти, масиви та примітивні значення.Реалізуйте за допомогою
Utf8JsonWriterJSON-документ такого вигляду:{ "report": { "date": "2024-01-15", "items": [1, 2, 3], "valid": true } }Назвіть методи, що ви використаєте для кожного елементу.
Для чого потрібен
JsonConverter<T>? Реалізуйте конвертерDateOnlyJsonConverter, що серіалізуєDateOnlyу рядок формату"dd.MM.yyyy"і десеріалізує назад. Як зареєструвати його через атрибут і через глобальні налаштування?Поясніть
[JsonPolymorphic]і[JsonDerivedType]. Яку проблему вони вирішують? Напишіть ієрархіюAnimal(базовий) →Dog,Catз дискримінатором та продемонструйте, як JSON виглядає після серіалізації списку.Що таке JSON Source Generators? Яку проблему з рефлексією вони вирішують і в яких середовищах особливо важливі (AOT, Blazor WASM)? Напишіть мінімальний приклад з
[JsonSerializable]таJsonSerializerContext.Назвіть щонайменше 3 проблеми безпеки при десеріалізації JSON від зовнішніх джерел. Чому рекомендують мати окремі DTO для вводу та виводу? Що таке
MaxDepthі чому важливо його обмежувати?
19.2. XML та XmlDocument
Поясніть структуру XML-документа: що таке декларація, елемент, атрибут, namespace? Напишіть XML-фрагмент для опису лікаря з атрибутом
idта вкладеними елементами.Розгляньте код:
var doc = new XmlDocument(); doc.LoadXml(xml); XmlNode root = doc.DocumentElement; foreach (XmlNode child in root.ChildNodes) { Console.WriteLine(child.InnerText); }Чим
InnerTextвідрізняється відInnerXml? Наведіть XML, де ці два значення різні.Напишіть XPath-вираз і відповідний C# код для
XmlDocument.SelectNodes(), що знаходить всі елементи<appointment>де атрибутstatusдорівняє"confirmed"і дочірній елемент<doctor>має значення"Smith".Порівняйте
SelectSingleNodeіSelectNodes. Що повертаєSelectSingleNode, якщо нічого не знайдено? Що станеться, якщо передати хибний XPath? Напишіть безпечний виклик з перевіркою результату.Програмно побудуйте за допомогою
XmlDocumentнаступну структуру:<patients> <patient id="1"> <name>John Doe</name> <age>35</age> </patient> </patients>Назвіть методи
CreateElement,CreateAttribute,SetAttribute,AppendChildу правильному порядку.Як зберегти
XmlDocumentу файл? Як зберегти у рядок? Напишіть обидва варіанти та поясніть, коли кожен з них доцільний.Що таке
XmlTextWriterі коли він використовується разом зXmlDocument.WriteTo()? Покажіть, як налаштувати форматований вивід з відступами.
19.3. XDocument та LINQ to XML
Порівняйте стиль створення XML-документа в
XmlDocumentпротиXDocument. У чому перевага декларативного синтаксисуXDocument? Відтворіть той самий XML-фрагмент обома способами.Розгляньте код:
var doc = XDocument.Parse(xml); var names = doc.Root .Elements("patient") .Where(p => (int)p.Element("age") > 30) .Select(p => (string)p.Element("name")) .OrderBy(n => n);Поясніть кожен крок LINQ-ланцюжка. Що станеться, якщо елемент
<age>відсутній?Чим
Element("name")відрізняється відElements("name")таDescendants("name")? Наведіть XML, де ці три методи дадуть різні результати.Напишіть метод, що завантажує XML-файл пацієнтів, знаходить пацієнта за ID, оновлює його вік та зберігає файл назад. Використайте
SetValueабоSetAttributeValue.Реалізуйте LINQ запит по
XDocument, що групує лікарів за спеціальністю і для кожної групи виводить кількість та середній стаж. ВикористайтеGroupByіSelect.Напишіть метод
List<Patient> ParsePatients(XDocument doc), що витягує всі записи пацієнтів з XML і повертає строго типізований список C# об'єктів. Обробіть відсутні необов'язкові елементи.Як
XDocumentпорівнюється зXmlDocumentза продуктивністю? Коли краще використовуватиXmlDocument, а колиXDocument? Що таке LINQ to XML і чим воно відрізняється від XPath уXmlDocument?
19.4. XmlReader та XmlWriter
Що означає "forward-only" читання? У яких сценаріях
XmlReaderє єдиним правильним вибором порівняно зXmlDocumentабоXDocument?Розгляньте код:
using var reader = XmlReader.Create("data.xml"); while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && reader.Name == "patient") { string id = reader.GetAttribute("id"); reader.ReadToDescendant("name"); string name = reader.ReadElementContentAsString(); } }Поясніть кожен крок. Що відбудеться, якщо елемент
<name>відсутній всередині<patient>?Назвіть 5 значень
XmlNodeType, які зустрічаються при читанні реального XML. Напишіть умову, що ігнорує пробіли та коментарі за допомогоюXmlReaderSettings.Чим
ReadToFollowing,ReadToDescendantіReadToNextSiblingвідрізняються один від одного? Намалюйте (текстово) XML-дерево та покажіть, до якого вузла переміститься кожен метод від поточної позиції.Реалізуйте метод
XmlToJsonStream(Stream xmlInput, Stream jsonOutput), що зчитує XML пацієнтів за допомогоюXmlReaderі записує їх у JSON за допомогоюUtf8JsonWriter, не завантажуючи весь документ у пам'ять.Напишіть за допомогою
XmlWriterдокумент з правильною декларацією, коментарем, кількома елементами та атрибутами. НалаштуйтеXmlWriterSettingsдля форматованого виводу зIndent = trueта кодуванням UTF-8.Опишіть паттерн "XmlReader + XmlWriter трансформація". Напишіть метод
FilterLargeXml(string inputPath, string outputPath, Predicate<string> keepPatient), що читає великий XML пацієнтів і записує тільки тих, що задовольняють умову.
19.5. XmlSerializer
Які вимоги до класу для роботи з
XmlSerializer? Що станеться, якщо клас не має публічного конструктора без параметрів? Чому поля та властивості мають бути публічними?Розгляньте код:
[XmlRoot("medicalRecord")] public class Record { [XmlAttribute("id")] public int Id { get; set; } [XmlElement("patientName")] public string Name { get; set; } [XmlIgnore] public string InternalNotes { get; set; } }Як виглядатиме XML після серіалізації? Як виглядатиме XML без жодних атрибутів?
Поясніть різницю між
[XmlElement]і[XmlAttribute]. Яка між ними семантична різниця з погляду XML-моделювання? Коли краще використовувати атрибут, а коли елемент?Як серіалізувати список за допомогою
[XmlArray]і[XmlArrayItem]? Напишіть класHospitalзі спискомDoctorsта покажіть очікуваний XML. Як виглядатиме XML без цих атрибутів?Що таке
[XmlInclude]? Напишіть ієрархіюPayment→CashPayment,CardPaymentз можливістю серіалізації черезXmlSerializer. Чим це відрізняється від[JsonPolymorphic]?Як позбутися namespace-ів
xmlns:xsiтаxmlns:xsdу серіалізованому XML? Напишіть код зXmlSerializerNamespaces, що генерує чистий XML без зайвих просторів імен.Порівняйте
XmlSerializerз ручним підходом черезXmlDocument. Коли варто обратиXmlSerializer, а коли ручне керування? Які обмеження є уXmlSerializer?
19.6. XPath та порівняння JSON і XML
Поясніть XPath-вирази:
/root/patient,//patient,patient[@status='active'],patient[1],patient[last()]. Чим/відрізняється від//?Напишіть XPath для таких задач:
- Знайти всі
<appointment>елементи на будь-якому рівні вкладеності - Знайти
<patient>, у якого<age>більше 30 - Знайти перший
<doctor>з атрибутомspecialty, що містить слово "cardio" - Підрахувати кількість
<appointment>зі статусом "pending"
- Знайти всі
Які вісі XPath (axes) ви знаєте? Поясніть різницю між
child::,descendant::,following-sibling::іancestor::. Наведіть приклад XPath з явною назвою вісі.Порівняйте використання XPath у
XmlDocument.SelectNodes()і вXDocument.XPathSelectElements(). Що треба підключити для використання XPath уXDocument? Напишіть однаковий запит обома способами.Що таке
XPathNavigatorіXPathExpression? Яку перевагу дає компіляція XPath-виразу черезXPathExpression.Compile()? Коли це суттєво впливає на продуктивність?Заповніть таблицю порівняння JSON і XML за ознаками: розмір, читабельність, підтримка атрибутів, namespace-и, стандартна схема, типовий API (REST/SOAP), інструменти запитів. Для яких галузей/стандартів XML залишається обов'язковим?
Дано задачу: потрібно зберігати конфігурацію для веб-API. Аргументуйте вибір JSON або XML, враховуючи: читабельність, розмір, підтримку в .NET, тип клієнтів (браузер/мобільний/корпоративний).
Напишіть метод, що приймає XML-рядок медичного запису і за допомогою
XPathNavigatorта скомпільованогоXPathExpressionвиконує багаторазовий пошук різних полів. Порівняйте продуктивність з некомпільованим підходом.