кодирование массива байтов в Hex при сериализация Xml

при сериализации массива байтов XmlSerializer автоматические кодирует его в base64, можно ли как-то поменять на Hex?

  XmlSerializer xml = new XmlSerializer(typeof(iq));
  var doc = new XmlDocument();
  MemoryStream ms = new MemoryStream();
  xml.Serialize(ms, this);

Ответы (1 шт):

Автор решения: Alexander Petrov

Это можно сделать множеством разных способов. Например, так:

using System.Xml.Serialization;

XmlSerializer xml = new XmlSerializer(typeof(Test));

var test = new Test { Arr = new byte[] { 121, 121, 123, 124, 125 } };

using (var outStream = new FileStream("test.txt", FileMode.Create))
{
    xml.Serialize(outStream, test);
    xml.Serialize(Console.Out, test);
    Console.WriteLine();
}

using (var inStream = new FileStream("test.txt", FileMode.Open))
{
    var test2 = (Test)xml.Deserialize(inStream);
    Console.WriteLine(string.Join(",", test2.Arr));
}

public class Test
{
    [XmlIgnore]
    public byte[]? Arr { get; set; }

    public string ArrHex
    {
        get { return Convert.ToHexString(Arr); }
        set { Arr = Convert.FromHexString(value); }
    }
}

Массив байтов помечаем атрибутом [XmlIgnore], чтобы сериализатор его не замечал, а (де)сериализуем другое свойство с конвертацией значения.


Если постороннее свойство нежелательно иметь, то следует сделать дополнительный тип DTO и (де)сериализовать его.

→ Ссылка