C# xml文档反序列化记事

简介: 本文介绍了使用XmlSerializer进行XML序列化和反序列化的关键点。包括:1) 以独占方式读取XML文件以避免并发问题;2) 当元素名与类型名不一致时,可通过`[XmlArrayItem]`指定元素名,或创建继承自原始类型的子类;3) 处理DateTime反序列化错误,通过中间字符串属性转换;4) 提到了常用C#特性如`[XmlRoot]`, `[XmlElement]`, `[XmlAttribute]`, `[XmlIgnore]`和`[XmlArrayItem]`的作用。

可以使用XmlSerializer直接序列化和反序列化xml

注意其中几个关键点

1. 读取xml文件时,以独占方式,这样可以避免文件被别的程序打开时读取报错的问题。

using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {}

2. 在序列化反序列化时,当类型DeviceInfoDto对应的xml中元素的名字不是DeviceInfoDto而是device时,有两种解决方法:

方法一:

用该特性[XmlArrayItem("device")]指定类型DeviceInfoDto对应的在xml中的元素的名字device。

[XmlArrayItem("device")]
        public List<DeviceInfoDto> devices { get; set; } = new();

方法二:

需要变通:改以下代码中List<DeviceInfoDto>List<device>其中device为一个继承自DeviceInfoDto类型的子类

public List<device> devices { get; set; } = new();

public class device:DeviceInfoDto
{
}

3. 反序列化时对应C#类型DateTime时的报错处理

当直接使用一个类型为Datetime属性名为creationDate来在反序列化xml文件中的日期时间类型的接收者时,反序列化会报错:【字符串“2020-07-31 09:29:16”不是有效的AllXsd值】。于是采入引入一个中间属性stringCreationDate(类型为string)和存储其值的字段_creationDate(类型为DateTime)的方式,运行过程1.当反序列化时从xml文件读取元素名为creationDate的元素值并通过stringCreationDate的set访问器将其值在转值为DateTime类型后存放于字段_creationDate中 2.当C#代码中其他地方要访问这个值时,就从creationDate属性的get访问器传递出_creationDate字段的值。缺点:需引入不必要的属性和字段,而且属性名还必须是public的,这会让外部访问者对这个中间属性感到疑惑。

private DateTime _creationDate;
        [XmlElement(ElementName = "creationDate")]
        public string stringCreationDate { get => _creationDate.ToString("yyyy-MM-dd HH:mm:ss"); set => _creationDate = Convert.ToDateTime(value); }
        [XmlIgnore]
        public DateTime creationDate { get => _creationDate; }

4. 序列化反序列化时,XmlSerializer可识别的常用的C#特性标签 Attribute

a. [XmlRoot("udid")]

用于C#类名上,用于指明根类型对应的xml中的元素名

b. [XmlElement("creationDate")]

用于C#属性或字段上,用于指明属性对应的xml元素名或者叫标签名为 creationDate

c. [XmlAttribute("frequency")]

用于C#属性或字段上,用于指明属性或字段对应的XML元素的属性名为 frequency

d. [XmlIgnore]

用于C#属性或字段上,用来标记该字段在序列化反序列化XML文档时是要忽略的C#属性或字段

e. [XmlArrayItem("device")]

用于C# List<T>集合类型的属性或字段上,用来标记集合中的元素类型T在XML文档中对应的元素名称

相关文章
|
3月前
|
XML 数据采集 存储
使用Java和XPath在XML文档中精准定位数据
在数据驱动的时代,从复杂结构中精确提取信息至关重要。XML被广泛用于数据存储与传输,而XPath则能高效地在这些文档中导航和提取数据。本文深入探讨如何使用Java和XPath精准定位XML文档中的数据,并通过小红书的实际案例进行分析。首先介绍了XML及其挑战,接着阐述了XPath的优势。然后,提出从大型XML文档中自动提取特定产品信息的需求,并通过代理IP技术、设置Cookie和User-Agent以及多线程技术来解决实际网络环境下的数据抓取问题。最后,提供了一个Java示例代码,演示如何集成这些技术以高效地从XML源中抓取数据。
120 7
使用Java和XPath在XML文档中精准定位数据
|
2月前
|
XML JSON 数据处理
C# 中的 XML 与 JSON 数据处理
在现代软件开发中,数据交换和存储需求日益增长,XML 和 JSON 成为最常用的数据格式。本文从 C# 角度出发,详细介绍如何处理这两种格式,并提供示例代码。对于 XML,我们介绍了读取、创建和写入 XML 文件的方法;对于 JSON,则展示了如何使用 Newtonsoft.Json 库进行数据解析和序列化。此外,文章还总结了常见问题及其解决方案,帮助开发者更好地应对实际项目中的挑战。
177 61
C# 中的 XML 与 JSON 数据处理
|
16天前
|
XML C# 开发工具
C# 删除Word文档中的段落
【11月更文挑战第3天】本文介绍了两种方法来操作 Word 文档:一是使用 `Microsoft.Office.Interop.Word` 库,适用于 Windows 环境下操作 Word 文档,需引用相应库并在代码中引入命名空间;二是使用 Open XML SDK,适用于处理 .docx 格式的文档,通过引用 `DocumentFormat.OpenXml` 库实现。文中提供了示例代码,展示了如何打开、删除段落并保存文档。
|
1月前
|
XML 存储 缓存
C#使用XML文件的详解及示例
C#使用XML文件的详解及示例
88 0
|
1月前
|
XML JSON 前端开发
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
352 0
|
6月前
|
XML JavaScript 数据格式
XML Schema(XSD)详解:定义 XML 文档结构合法性的完整指南
XML Schema(XSD)是用于定义XML文档结构的规范,它描述了元素、属性及其顺序、数据类型和约束。与DTD相比,XML Schema支持更多数据类型,如字符串、日期等,并且是基于XML的,允许扩展和重用。学习XML Schema有助于确保数据通信时双方对内容的理解一致,通过验证防止错误。示例展示了如何定义一个`note`元素,包含`to`, `from`, `heading`和`body`子元素,都是字符串类型。XML文档可以通过引用XML Schema进行验证,确保内容符合预设模式。
498 0
|
6月前
|
XML 存储 JSON
c#XML、JSON的序列化和反序列化,看完你就懂了
c#XML、JSON的序列化和反序列化,看完你就懂了
104 0
|
6月前
|
XML 存储 数据格式
探索 DTD 在 XML 中的作用及解析:深入理解文档类型定义
DTD(文档类型定义)用于定义XML文档的结构和合法元素、属性。它允许不同团体就数据交换标准达成一致,并用于验证XML数据的有效性。DTD可通过内部声明(在XML文档内)或外部声明(在单独文件中)来定义。内部声明示例显示了如何定义`note`元素及其子元素的结构,而外部声明则引用外部DTD文件。元素、属性、实体和PCDATA/CDATA是XML构建模块。DTD中,元素通过ELEMENT声明定义,属性通过ATTLIST声明定义,实体声明提供特殊字符或外部资源的快捷方式。
113 0
|
13天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
28 3
|
1月前
|
安全 C# 数据安全/隐私保护
实现C#编程文件夹加锁保护
【10月更文挑战第16天】本文介绍了两种用 C# 实现文件夹保护的方法:一是通过设置文件系统权限,阻止普通用户访问;二是使用加密技术,对文件夹中的文件进行加密,防止未授权访问。提供了示例代码和使用方法,适用于不同安全需求的场景。