C# XmlTextWriter和XmlSerializer之间的区别?

C# XmlTextWriter和XmlSerializer之间的区别?,c#,C#,我正在使用XmlSerializer,突然遇到一个人在使用XmlTextWriter 这两者有什么区别 对我来说,它们具有相同的功能,即创建XML文件。微软网站说,XmlTextWriter提供了一种快速、非缓存、仅向前的流生成方式,但我真的不知道这意味着什么。XmlTextWriter类是一个知道XML的对象。您可以使用它生成任意XML文档。数据来自哪里并不重要;您可以从任何您认为合适的源中提取XML元素、属性和内容的数据以及XML文档的实际结构,而不需要匹配任何特定对象的结构或数据 另一方面

我正在使用
XmlSerializer
,突然遇到一个人在使用
XmlTextWriter

这两者有什么区别


对我来说,它们具有相同的功能,即创建XML文件。微软网站说,
XmlTextWriter
提供了一种快速、非缓存、仅向前的流生成方式,但我真的不知道这意味着什么。
XmlTextWriter
类是一个知道XML的对象。您可以使用它生成任意XML文档。数据来自哪里并不重要;您可以从任何您认为合适的源中提取XML元素、属性和内容的数据以及XML文档的实际结构,而不需要匹配任何特定对象的结构或数据

另一方面,
XmlSerializer
是一个知道类型的对象。它具有分析类型、提取重要信息并写出这些信息所必需的功能。它恰好能够使用
XmlTextWriter
对象来执行实际的I/O;您可以提供自己的,或者在某种程度上,它总是创建一个类似的对象来处理实际的I/O。换句话说,序列化器对象本身并不知道XML,也不需要知道。它将工作委托给另一个对象

微软网站说,
XmlTextWriter
提供了一种快速、非缓存、仅向前的方式来生成流,但我真的不知道这意味着什么

  • “快”:不慢
  • “非缓存”:重要信息在内存中的存储时间不会超过绝对需要的时间
  • “仅转发”:不能重新访问已创建的XML文档的某些部分
这与生成XML文档的其他方法不同,在这种方法中,整个文档结构在构造时保存在内存中,并且仅在构造完整个文档后才写入文件。这通常被描述为“文档对象模型”,或DOM


writer方法往往在性能上更有效,因为XML数据是根据需要动态生成的,直接从已有的其他内存中数据结构生成。由于DOM方法要求将整个文件的数据和结构一次表示在内存中,因此通常会使用更多内存,这在某些情况下会降低性能(坦白说,在现代计算机和典型的XML文档中,这通常是完全没有问题的).XmlTextWriter类是一个了解XML的对象。您可以使用它生成任意XML文档。数据来自哪里并不重要;您可以从任何您认为合适的源中提取XML元素、属性和内容的数据以及XML文档的实际结构,而不需要匹配任何特定对象的结构或数据

另一方面,
XmlSerializer
是一个知道类型的对象。它具有分析类型、提取重要信息并写出这些信息所必需的功能。它恰好能够使用
XmlTextWriter
对象来执行实际的I/O;您可以提供自己的,或者在某种程度上,它总是创建一个类似的对象来处理实际的I/O。换句话说,序列化器对象本身并不知道XML,也不需要知道。它将工作委托给另一个对象

微软网站说,
XmlTextWriter
提供了一种快速、非缓存、仅向前的方式来生成流,但我真的不知道这意味着什么

  • “快”:不慢
  • “非缓存”:重要信息在内存中的存储时间不会超过绝对需要的时间
  • “仅转发”:不能重新访问已创建的XML文档的某些部分
这与生成XML文档的其他方法不同,在这种方法中,整个文档结构在构造时保存在内存中,并且仅在构造完整个文档后才写入文件。这通常被描述为“文档对象模型”,或DOM


writer方法往往在性能上更有效,因为XML数据是根据需要动态生成的,直接从已有的其他内存中数据结构生成。由于DOM方法要求将整个文件的数据和结构一次表示在内存中,因此通常会使用更多内存,这在某些情况下会降低性能(坦白说,在现代计算机和典型的XML文档中,这通常是完全没有问题的).

XmlSerializer知道如何将对象序列化为xml。XmlTextWriter知道如何将xml写入流或文件。两个不同且不相关的操作。XmlSerializer知道如何将对象序列化为xml。XmlTextWriter知道如何将xml写入流或文件。两个不同且不相关的操作。假设我使用XmlTextWriter生成一个xml文件。因为它是只向前的,我将无法将xml文件加载到文本框并重写值?“因为它是只向前的,我将无法将xml文件加载到文本框并重写值?”--是和否。您可以始终使用例如
XmlTextReader
重新加载xml。您可以重写该值,但必须立即重写整个文件。实际上,如果从文件中反序列化对象,在文本框中显示对象的值,然后再次将对象序列化到文件中,这正是
XmlSerializer
所要做的。只是
XmlSerializer
在对象级别运行,所以您不必担心底层的XML实现细节。好吧,如果我理解正确,如果我使用XmlSerializer,我可以选择要覆盖的特定节点的值,但是如果我使用XmlTextWriter,我不能只覆盖特定的值,但如果我想更改单个val,必须覆盖整个文件