Чтение из файла XML в памяти с использованием XmlSerializer - PullRequest
0 голосов
/ 04 мая 2020

Я использую приведенный ниже код для открытия zip-архива в памяти.

using (var leagueFile = File.OpenRead(openFileDialog.FileName))
using (var package = new ZipArchive(leagueFile, ZipArchiveMode.Read))
{
    foreach (var team in package.Entries)
    {
        if (team.Name.EndsWith(".xml"))
        {
            _xmlHandler.Import<Player>(team.FullName, Encoding.UTF8);
            //...
        }
    }
}

Когда я пытаюсь десериализовать с помощью моего Import<T>() метода, происходит сбой приложения из-за того, что файл не найден.

public T Import<T>(string fileName, Encoding encoding) where T : class, new()
{
    var serializer = new XmlSerializer(typeof(T));
    serializer.UnknownNode += serializer_UnknownNode;
    serializer.UnknownAttribute += serializer_UnknownAttribute;

    var reader = XmlReader.Create(new StreamReader(fileName, encoding));
    var po = (T)serializer.Deserialize(reader);

    return po;
}

Проблема в том, что приложение ищет fileName в каталоге bin приложения. Не в stream (?) Zip-архива. Есть ли способ сделать это с XmlSerializer классом?

1 Ответ

1 голос
/ 04 мая 2020

Измените ваш код, как показано ниже:

using (var leagueFile = File.OpenRead(openFileDialog.FileName))
using (var package = new ZipArchive(leagueFile, ZipArchiveMode.Read))
{
    foreach (var team in package.Entries)
    {
        if (team.Name.EndsWith(".xml"))
        {
            using(var xmlStream = team.Open())
            {
                _xmlHandler.Import<Player>(xmlStream, Encoding.UTF8);
                //...
            }

        }
    }
}

public T Import<T>(Stream input, Encoding encoding) where T : class, new()
{
    var serializer = new XmlSerializer(typeof(T));
    serializer.UnknownNode += serializer_UnknownNode;
    serializer.UnknownAttribute += serializer_UnknownAttribute;

    var reader = XmlReader.Create(input);
    var po = (T)serializer.Deserialize(reader);

    return po;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...