Сериализация / десериализация изображения в / из XElement - PullRequest
1 голос
/ 04 мая 2011

Я пытаюсь сериализовать изображение в XElement, а затем десериализовать его для дальнейшего использования.Я использую этот метод для сериализации:

public XElement subElement = new XElement("Element");
private void Serialize(System.Windows.Forms.Button button) {
    if (button.Image != null) {
        var bf = new BinaryFormatter();
        var ms = new MemoryStream();
        bf.Serialize(ms, button.Image);
        var textWriter = new StringWriter();
        var writer = new XmlTextWriter(textWriter);
        byte[] imageBytes = ms.ToArray();
        writer.WriteBase64(imageBytes, 0, imageBytes.Length);
        subElement.Add(new XAttribute("Image", imageBytes));
    }
}

Но я не могу понять, как десериализовать.Я пробовал что-то вроде этого:

private void Deserialize(XElement element) {
    if (element.Attribute("Image") != null) {
        //tried XmlReader reader = XmlReader.Create(new StringReader(element.Attribute("Image").Value));
        //but reader is empty
        //when I try: XmlReader reader = XmlReader.Create(element.Attribute("Image").Value);
        //exception is thrown because XmlReader expects path, not element
    }
}

Мне в основном нужно только получить байтовый массив из XElement, позже я знаю, как с этим справиться.

Ответы [ 2 ]

2 голосов
/ 04 мая 2011

Как только вы получите свой байтовый массив, вы можете сделать Convert.ToBase64String(byteArray). Результатом этой функции (строки) является то, что входит в значение XAttribute.

Тогда, когда дело доходит до чтения, вы просто делаете byteArray = Convert.FromBase64String(element.Attribute("Image").Value)

Это должно предотвратить проблемы с сохранением строки в файле XML.

0 голосов
/ 04 мая 2011

Не используйте сериализацию, просто сохраните / загрузите ее из потока памяти.

...