using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace AyCode.Services.Nav;
///
/// XML (de)szerializáció a NAV REST hívásokhoz. A NAV sima HTTP POST-ot vár, a body XML (UTF-8) — nincs SOAP.
/// A generált XSD-modellek [XmlRoot]/[XmlElement] attribútumai adják a namespace-t és a sorrendet.
///
public static class NavXmlHelper
{
///
/// A típust UTF-8 XML stringgé szerializálja. A biztosítja, hogy az XML-deklaráció
/// encoding="utf-8" legyen (a default UTF-16-ot írna, amit a NAV elutasít).
///
public static string Serialize(T value)
{
var serializer = new XmlSerializer(typeof(T));
using var stringWriter = new Utf8StringWriter();
using var xmlWriter = XmlWriter.Create(stringWriter, new XmlWriterSettings
{
Encoding = Encoding.UTF8,
Indent = false,
OmitXmlDeclaration = false,
});
serializer.Serialize(xmlWriter, value);
return stringWriter.ToString();
}
/// A NAV válasz XML-t a megadott típusra deszerializálja.
public static T Deserialize(string xml)
{
var serializer = new XmlSerializer(typeof(T));
using var reader = new StringReader(xml);
return (T)serializer.Deserialize(reader)!;
}
///
/// , ami UTF-8-at jelez — így az az XML-deklarációba
/// encoding="utf-8"-at ír. (A BCL alap -e UTF-16-ot jelez.)
///
private sealed class Utf8StringWriter : StringWriter
{
public override Encoding Encoding => Encoding.UTF8;
}
}