首页 > 解决方案 > 使用 XmlSerializer 从内存中的 XML 文件读取

问题描述

我使用下面的代码在内存中打开 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。不在streamzip 存档的 (?) 中。有没有办法在XmlSerializer课堂上做到这一点?

标签: c#xml

解决方案


修改您的代码如下:

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;
}

推荐阅读