c# - 使用 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
。不在stream
zip 存档的 (?) 中。有没有办法在XmlSerializer
课堂上做到这一点?
解决方案
修改您的代码如下:
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;
}
推荐阅读
- python - TensorFlow 加载模型以检查其中的内容
- ios - 当 iOS React Native 中的 url 为“private/var/mobile/Containers/Shared/AppGroup/.....”时,文件存在返回 false
- asp.net - 将参数和模型传递给 PagedListPager 中的组件视图
- python - 我的函数的进度条(Python、pandas)
- r - 为什么在 R 中显示未知时区
- javascript - 通过使用 React 成帧器动作“拖动和重新排序”,我可以拖动卡片但不会粘到新位置。拖完后,回到原来的样子
- cmake - CMake - 如何检查字符串是否是文件路径?
- c# - TextBox 内容未绑定到源 WPF DataGrid
- r - 在 R 中存储大型数据帧的最佳格式之一是什么?
- webpack - 将 CKEditor 集成到 Shopware 6