XmlSerializer 的 UnknownNode 和 UnknownAttribute 事件用于捕获反序列化时类中无对应成员的 XML 节点或属性,仅在调用 Deserialize 且遇到多余元素或属性时触发,不用于修复缺失字段,也不在序列化或类型转换错误时触发。

XmlSerializer 的 UnknownNode 和 UnknownAttribute 事件,是用来捕获反序列化时遇到的、类定义中没有对应成员的 XML 节点或属性的机制。它们不是用来“修复”缺失字段,而是帮你感知和调试结构不匹配问题,或实现柔性解析(比如跳过未知内容、记录日志、动态处理扩展字段)。
只有在调用 Deserialize 方法反序列化 XML 字符串/流时,且 XML 中存在以下情况,才会触发:
<version>1.2</version>,但你的类没写 public string Version { get; set; });<user id="100">...</user>,但类里没写 [XmlAttribute("id")] public string Id { get; set; })。注意:这两个事件 不会触发 在序列化(Serialize)过程中;也不会在节点/属性类型不匹配(如字符串赋给 int 字段)时报错时触发——那种情况直接抛异常,不走 Unknown 事件。
订阅方式很简单:在创建 XmlSerializer 实例后,给两个事件加处理方法,再调用 Deserialize:
var serializer = new XmlSerializer(typeof(User));
serializer.UnknownNode += (sender, e) =>
{
Console.WriteLine($"未知节点:{e.Name},值:{e.Text},位置:{e.LineNumber}:{e.LinePosition}");
};
serializer.UnknownAttribute += (sender, e) =>
{
Console.WriteLine($"未知属性:{e.Name}={e.Attr.Value},位置:{e.LineNumber}:{e.LinePosition}");
};
using var reader = new StringReader(xmlString);
var user = (User)serializer.Deserialize(reader); // 触发事件(如果有的话)
事件参数 XmlUnknownNodeEventArgs 和 XmlUnknownAttributeEventArgs 都包含:Name(节点/属性名)、Text 或 Attr(内容或 XmlAttribute 对象)、LineNumber/LinePosition(便于定位)。
Dictionary<string string></string> 字段(需手动赋值,XmlSerializer 不自动做),实现“半强类型”解析;基本上就这些。用好它们,能让 XML 解析更健壮、更透明,而不是总等到报错才去翻 XML 文件。
以上就是C# XmlSerializer的UnknownNode和UnknownAttribute事件怎么用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号