XMLSerialization/直接写文件时原文件总被还原无法保存新内容
常见问题排查步骤
- 先确认程序实际读写的文件路径和你手动查看的路径一致
不要信任相对路径,在写入代码前加断点,执行Path.GetFullPath(你的保存文件名)拿到完整绝对路径,直接在资源管理器打开对应位置的文件核对。VB调试时程序默认运行在bin/调试配置目录下,很多人误改了项目根目录下的模板文件,实际程序读写的是输出目录里的副本,怎么改都看不到变化。 - 校验传入写入方法的数据源是否正确
在执行删除旧文件、写入新内容的逻辑前,直接打印待保存的列表计数、每个对象的属性值、字符串列表的项数。90%以上的同类问题本质是新增实例的逻辑没有真正把对象加到你要序列化的目标列表里,传入写入方法的始终是程序启动时生成的默认单对象列表,和用XML序列化还是纯文本写入没有关系。 - 检查是否存在自动还原默认文件的逻辑
全局搜索项目里所有操作该目标文件的代码,重点看启动阶段的异常处理分支:很多人会写“如果读取配置文件失败就自动生成默认配置覆盖”的逻辑,一旦读取新文件的代码有兼容性问题抛错,异常被catch块吞掉之后就会直接触发默认文件生成,把你刚写入的新文件覆盖成初始版本。 - 排除外部软件的文件拦截/还原干扰
不要把文件存到OneDrive、坚果云这类同步盘目录,也暂时关闭杀毒软件的文件防护功能测试。这类软件会在检测到文件变更时自动同步旧版本、或者拦截未知程序的写入操作,导致你写入的内容没有真正落盘,旧文件被自动还原。测试时可以把文件存到非系统盘、非同步目录的新建文件夹里重试。 - 确认文件流正确释放、内容完全刷入磁盘
所有文件操作都必须用Using块包裹流对象,不要手动调用.Close()方法——如果写入过程中触发异常,没有Using的话缓冲区里的内容不会被写入磁盘,文件会保持旧版本的内容。正确的XML序列化写法参考:
代码执行到Using writeStream As New FileStream(saveFullPath, FileMode.Create, FileAccess.Write) Dim xmlSer As New XmlSerializer(GetType(List(Of 你的自定义类))) xmlSer.Serialize(writeStream, targetList) End UsingEnd Using时会自动释放流资源,把所有缓冲区内容强制写入磁盘,不会出现内容残留的问题。
内容的提问来源于stack exchange,提问作者LGGJR
相关产品推荐
相关产品推荐

