首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >XPath与DeSerialization:哪一个在读取操作方面性能更好

XPath与DeSerialization:哪一个在读取操作方面性能更好
EN

Stack Overflow用户
提问于 2008-11-10 11:59:55
回答 3查看 5.1K关注 0票数 10

我正在将小的(2-10 KB)XML文档作为WCF服务的输入。现在我有两个选项可以从传入的XML读取数据值

  1. 反序列化为强类型对象,并使用对象属性访问值
  2. 使用XPath访问值

哪种方法更快?一些统计数据来支持你的答案将是很好的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-11-20 23:16:15

我会把它反序列化。

如果使用xpath,将反序列化(或“加载”)到XmlDocument或其他地方。因此,这两种解决方案都使用时间反序列化。在完成之后,xpath将变得更慢,因为解析该字符串、解析名称、执行函数等等都花费了时间。另外,如果使用xpath,则没有类型安全性。编译器无法为您检查xpath语法。

如果使用XmlSerializer和类,则会得到静态类型。对数据的访问非常快,如果您想使用xpath查询数据,仍然有一些方法可以做到这一点。

另外,我想说,您的代码在类中可能更容易理解。

唯一的缺点是xml必须始终遵循相同的模式,但在您的情况下,这可能不是真正的问题。

我希望你们原谅没有统计数据,我认为没有例子的论点是足够有力的。如果你想要一个最终的答案,试一试,并保持秒表准备。

票数 9
EN

Stack Overflow用户

发布于 2008-11-10 12:04:25

第三种选择是坚持使用XML,但是使用任何XML进行查询--例如LINQ -使得查询在代码中相对简单。

您是否已经将文本解析为XML文档?

您是否确信这实际上是代码中的一个重要性能瓶颈?(例如,如果你当时正在和一个数据库交谈,那就不用担心这件事了-先让它以最简单的方式工作吧)

查询总是相同的,还是在某种程度上是动态的?

你有一个带有真实信息和查询的测试平台吗?如果不是,您需要一个,以评估在这里给出的任何答案与您的数据。如果你这么做了,我希望你自己尝试它会相当容易:)

票数 4
EN

Stack Overflow用户

发布于 2016-06-06 19:27:28

这里有四个箱子,每次都在滴答作响:

4th)

  • Implementing
  • XmlSerializer (最慢IXmlSerializable (第3)
  • 手卷(自定义)(第1)
  • XElement(第2)

)

示例对象被读取1000次。

你应该在乎吗?对于大多数情况,使用内置到.net中的默认序列化程序。没有必要偏离,这将产生最小数量的代码。这些应该是足够的,提供类型安全,并释放自己做更有意义的事情与你的时间。在某些情况下,如果希望从大型XML结构中选择某些数据元素,XElement可能很有用,但即使这样,也应该将这些元素放入强类型的DTO中。但请记住,所有的方法都是非常快的。我亲自在几毫秒内序列化了一个极其广泛和深入的对象模型(远远超过400个类)。对于较小和琐碎的对象,它将是子ms响应时间。XMLSerializer热身比其他的要慢,但是一个可以通过SGEN缓解或者在启动时进行一些初始化。

细节和密码..。

Xml序列化程序

代码语言:javascript
运行
复制
[Serializable]
    public class FoobarXml
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public bool IsContent { get; set; }

        [XmlElement(DataType = "date")]
        public DateTime BirthDay { get; set; }
    }

第一次: 2448965

1000读平均数: 245

IXmlSerializable

代码语言:javascript
运行
复制
 public class FoobarIXml : IXmlSerializable
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public bool IsContent { get; set; }
        public DateTime BirthDay { get; set; }

        public XmlSchema GetSchema()
        {
            return null;
        }

        public void ReadXml(XmlReader reader)
        {
            reader.MoveToContent();
            var isEmptyElement = reader.IsEmptyElement;
            reader.ReadStartElement();
            if (!isEmptyElement)
            {
                Name = reader.ReadElementString("Name");

                int intResult;
                var success = int.TryParse(reader.ReadElementString("Age"), out intResult);
                if (success)
                {
                    Age = intResult;
                }

                bool boolResult;
                success = bool.TryParse(reader.ReadElementString("IsContent"), out boolResult);
                if (success)
                {
                    IsContent = boolResult;
                }
                DateTime dateTimeResult;
                success = DateTime.TryParseExact(reader.ReadElementString("BirthDay"), "yyyy-MM-dd", null,
                    DateTimeStyles.None, out dateTimeResult);
                if (success)
                {
                    BirthDay = dateTimeResult;
                }
                reader.ReadEndElement(); //Must Do
            }
        }

        public void WriteXml(XmlWriter writer)
        {
            writer.WriteElementString("Name", Name);
            writer.WriteElementString("Age", Age.ToString());
            writer.WriteElementString("IsContent", IsContent.ToString());
            writer.WriteElementString("BirthDay", BirthDay.ToString("yyyy-MM-dd"));
        }
    }
}

第一次: 2051813

1000读平均数: 208

手轧

代码语言:javascript
运行
复制
 public class FoobarHandRolled
    {
        public FoobarHandRolled(string name, int age, bool isContent, DateTime birthDay)
        {
            Name = name;
            Age = age;
            IsContent = isContent;
            BirthDay = birthDay;
        }

        public FoobarHandRolled(string xml)
        {
            if (string.IsNullOrWhiteSpace(xml))
            {
                return;
            }

            SetName(xml);
            SetAge(xml);
            SetIsContent(xml);
            SetBirthday(xml);
        }

        public string Name { get; set; }
        public int Age { get; set; }
        public bool IsContent { get; set; }
        public DateTime BirthDay { get; set; }

        /// <summary>
        ///     Takes this object and creates an XML representation.
        /// </summary>
        /// <returns>An XML string that represents this object.</returns>
        public override string ToString()
        {
            var builder = new StringBuilder();
            builder.Append("<FoobarHandRolled>");

            if (!string.IsNullOrWhiteSpace(Name))
            {
                builder.Append("<Name>" + Name + "</Name>");
            }

            builder.Append("<Age>" + Age + "</Age>");
            builder.Append("<IsContent>" + IsContent + "</IsContent>");
            builder.Append("<BirthDay>" + BirthDay.ToString("yyyy-MM-dd") + "</BirthDay>");
            builder.Append("</FoobarHandRolled>");

            return builder.ToString();
        }

        private void SetName(string xml)
        {
            Name = GetSubString(xml, "<Name>", "</Name>");
        }

        private void SetAge(string xml)
        {
            var ageString = GetSubString(xml, "<Age>", "</Age>");
            int result;
            var success = int.TryParse(ageString, out result);
            if (success)
            {
                Age = result;
            }
        }

        private void SetIsContent(string xml)
        {
            var isContentString = GetSubString(xml, "<IsContent>", "</IsContent>");
            bool result;
            var success = bool.TryParse(isContentString, out result);
            if (success)
            {
                IsContent = result;
            }
        }

        private void SetBirthday(string xml)
        {
            var dateString = GetSubString(xml, "<BirthDay>", "</BirthDay>");
            DateTime result;
            var success = DateTime.TryParseExact(dateString, "yyyy-MM-dd", null, DateTimeStyles.None, out result);
            if (success)
            {
                BirthDay = result;
            }
        }

        private string GetSubString(string xml, string startTag, string endTag)
        {
            var startIndex = xml.IndexOf(startTag, StringComparison.Ordinal);
            if (startIndex < 0)
            {
                return null;
            }

            startIndex = startIndex + startTag.Length;

            var endIndex = xml.IndexOf(endTag, StringComparison.Ordinal);
            if (endIndex < 0)
            {
                return null;
            }

            return xml.Substring(startIndex, endIndex - startIndex);
        }
    }

第一次: 161105

1000读平均数: 29

XElement

代码语言:javascript
运行
复制
        var xDoc = XElement.Parse(xml);

        var nameElement = xDoc.Element("Name");
        var ageElement = xDoc.Element("Age");
        var isContentElement = xDoc.Element("IsContent");
        var birthDayElement = xDoc.Element("BirthDay");

        string name = null;
        if (nameElement != null)
        {
            name = nameElement.Value;
        }
        var age = 0;
        if (ageElement != null)
        {
            age = int.Parse(ageElement.Value);
        }
        var isContent = false;
        if (isContentElement != null)
        {
            isContent = bool.Parse(isContentElement.Value);
        }
        var birthDay = new DateTime();
        if (birthDayElement != null)
        {
            birthDay = DateTime.ParseExact(birthDayElement.Value, "yyyy-MM-dd", CultureInfo.InvariantCulture);
        }

第一次: 247024

1000读平均数: 113

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/277710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档