【问题标题】:Difference Between XMLReader.Create() and new XMLTextReader()XMLReader.Create() 和新 XMLTextReader() 之间的区别
【发布时间】:2010-12-05 19:59:19
【问题描述】:

我想了解XMLReader.Createnew XMLTextReader() 之间的区别来读取XML。为什么我会选择一个而不是另一个?
有性能差异吗?

我知道 XMLReader 是 XMLTextReader 的一种抽象类型,至少我之前读到过,但我在某处看到有人建议使用 XMLReader.Create() 方法而不是新的 XMLReader() 实例。

提前谢谢...

真诚的。

【问题讨论】:

    标签: c# xml


    【解决方案1】:

    XmlReader.Create 允许您指定 XmlReaderSettingsXmlTextReader 构造函数重载都没有。

    【讨论】:

    【解决方案2】:

    对于为什么这种代码存在的一般答案,您可能需要查看Factory Method Pattern。使用工厂方法和抽象类/接口可以帮助您编写更通用的代码,而无需将自己束缚于特定的实现。这有助于使您的代码更容易利用新功能或在不同情况下使用。

    【讨论】:

    • 讽刺哦,是的,在多个环境中发现重要的错误真的很高兴。
    • 说真的。只是一个警告:工厂模式很快就会变得邪恶并转向他们的主人。首先,您立即失去了编译时安全性。其次,保持许多版本的一致性会变得非常痛苦。我见过一些案例(其中一些是我的 ;-) )工厂模式由于系统中的主要设计缺陷而成为必需品。不要误会我的意思,我的意思是在某些情况下它们可能是隐藏某些东西的最佳方式,但在其他情况下你只想知道:-)
    【解决方案3】:

    微软的回答很简单:

    虽然 Microsoft .NET Framework 包含 XmlTextWriter 类,它是 XmlWriter 类的一个实现,但在 2.0 版本中,建议您使用 Create 方法来创建新的 XmlWriter 对象。 Create 方法允许您在创建的 XmlWriter 对象上指定要支持的功能,它还允许您充分利用 2.0 版本中引入的新功能。

    但是这个答案忽略了最重要的区别:

    如果您调用“new XmlTextReader”,它将被设置为“v1compat”模式,这将导致它在某些情况下具有非常糟糕的流式传输行为,可能导致 OutOfMemoryExceptions!有关更多信息,请参阅Why is my new XmlTextReader(stream) reading in many megabytes into memory rather than streaming properly?

    建议:除非您确实需要 .NET 1.1 行为,否则您永远不应该调用“new XmlTextReader”,而是始终调用“XmlReader.Create”。

    【讨论】:

    • 有没有办法将 XmlReader 置于“v1compat”模式?
    • 此外,默认情况下 XmlTextReader 容易受到 XXE 攻击,除非您明确设置 DtdProcessing=Prohibit。 XmlReader 默认有 Prohibit。见jardinesoftware.net/2016/05/26/xxe-and-net
    猜你喜欢
    • 2016-03-19
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2020-05-10
    • 2014-09-20
    • 2010-10-28
    相关资源
    最近更新 更多