C # Десериализация автоматически десериализовывает строку как байтовый массив для атрибута через пользовательский код? - PullRequest
1 голос
/ 28 октября 2019

У меня есть класс с байтовым массивом в качестве атрибута в виде двоичного файла

[System.Xml.Serialization.XmlAttributeAttribute(DataType="hexBinary")]
    public byte[] aValue {
        get {
            return this.aValueField;
        }
        set {
            this.aValueField= value;
        }
    }

У самих данных ... для aValue ... есть строка внутри XML-файла, в котором я пытаюсь десериализоватьопределенные файлы.

Для десериализации я делаю это:

XmlSerializer xml = new XmlSerializer(typeof(Data));
using (Stream reader = new FileStream(file, FileMode.Open))
{
     config = (Data)xml.Deserialize(reader);
}

Проблема в том, что данные в файле XML содержат строку, а не байт [] (но другие файлы делаютиметь действительный байт [] тоже). Я не могу изменить данные входного файла и не могу изменить атрибут на строку, это должен быть байт [] для других обработанных файлов. Есть ли способ сделать пользовательское преобразование во время этого процесса десериализации каким-либо образом во время использования кода только для этого поля, если вход является строкой, чтобы выполнить пользовательское преобразование в byte [] с использованием логики? Таким образом, это не исключение и не получить класс.

1 Ответ

2 голосов
/ 28 октября 2019

Если вы можете различить строку и байт [] в коде, вы можете добавить другое свойство для обработки сериализации и сделать aValue XmlIgnore, чтобы он не десериализовался, но все равно будет установлен внутри набора bValue.

private string bValueField;

[System.Xml.Serialization.XmlIgnore]
public byte[] aValue { get; set; }

[System.Xml.Serialization.XmlAttribute("aValue")]
public string bValue
{
    get
    {
        return bValueField;
    }
    set
    {
        if (value.Contains("string identifier here")) // i.e. it's not a byte[]
        {
            aValue = new byte[] { };
            bValueField = value;
        }
        else // it's a byte[]
        {
            var formatter = new BinaryFormatter();
            using (var stream = new MemoryStream(Encoding.Unicode.GetBytes(value ?? "")))
            {
                aValue = (byte[])formatter.Deserialize(stream);
                bValueField = "not a string";
            }
        } 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...