gpt4 book ai didi

c# - 在不知道类型的情况下反序列化 XML

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:34 25 4
gpt4 key购买 nike

我有一个数据库列,其中包含一些 XML 数据作为字符串。因此,我不知道此 xml 表示的实际类型我想读取此 XML 的根标记,而不是反序列化此类型的完整内容。因为嵌入的 XML 可能非常大并且表包含数千个这样的对象,所以我需要一个快速的解决方案。我的第一种方法是使用一些字符串魔术(可能使用正则表达式)简单地提取根标记,通过调用 Type.GetType 获取类型,然后为该类型创建序列化程序。但是我看了一下 XMLReader,它也支持 ValueType 属性。

using (XmlReader reader = XmlReader.Create(new StringReader(myXmlAsString)))
{
reader.MoveToContent(); // get the root-element
Type type = reader.ValueType;

XmlSerializer ser = new XmlSerializer(type);
return ser.Deserialize(reader);
}

我必须面对的问题是 reader.ValueType 总是返回字符串类型,而不是根标签表示的类型。

最后:这两种解决方案中哪一种会更快?第一个瓶颈应该是获取 tapeName 的正则表达式引擎,第二个方法可能是读取器操作。

最佳答案

XML 没有类型(它只是结构化文本),因此要使用哪种类型进行反序列化取决于您,而不是 XML。这就是为什么您必须将类型名称传递给 XmlSerializer 的原因,也是为什么 XmlReader 不能返回类型名称的原因,即使它想要返回也是如此。如果您检查序列化的 XML,您将看到没有包含任何 .NET 类型名称(除非您自己包含它)。

使用XmlReader 获取根元素名称是一种很好的方法。当然,您绝对为此使用正则表达式,因为 XML 不是常规语言——如果解决方案不正确,速度并不重要。但是,您应该使用 reader.MoveToContent() 获取根而不是硬编码 .Read() 调用以跳过特定数量的节点。

我不会担心这种方法的性能,因为大部分时间将花在 1) 将整个字符串从数据库服务器传输到客户端以及 2) 反序列化内容。有一些方法可以减少 1) 和 2),但这有点超出了这个问题的范围。

另一种可能适合也可能不适合您的情况的解决方案是使用 SQL Server 中的 XML 支持来读取根元素 ( How to get the ROOT node name from SQL Server ),因为如果您需要,这将允许您完全跳过返回元素没兴趣。这会将处理转移到服务器,这可能会或可能不会有良好的性能。

关于c# - 在不知道类型的情况下反序列化 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26464136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com