将XML反序列化为for循环中的C#对象列表太慢

时间:2018-06-20 07:02:18

标签: c# xml performance serialization xmlserializer

我有一个C#文件,该文件是通过使用wsdl.exe实用程序自动生成的。 该文件包含以下代码示例中使用的“ MyObject”类。 我现在尝试手动反序列化Web服务对对象模型的原始响应。

XML结构如下:

<?xml version="1.0">
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope">
    <soap:Body>
        <ns2:myResponse xmlns:ns2="http://myurl.com">
            <return>...</return>
            <return>...</return>
            <return>...</return>
            ...
        </ns2:myResponse>
    </soap:Body>
</soap:Envelope>

以下代码用于将“ return”元素反序列化为“ MyObject”:

var file = @"C:\Data\example_response.xml";
var xdoc = XDocument.Load(file);
var myNamespace = "http://myurl.com";
var results = xdoc.Descendants(XName.Get("myResponse", myNamespace)).Elements();
var myObjects = new List<MyObject>();

foreach (var result in results)
{
    XmlRootAttribute xRoot = new XmlRootAttribute();
    xRoot.ElementName = "return";
    xRoot.IsNullable = true;

    var serializer = new XmlSerializer(typeof(MyObject), xRoot);
    var output = (MyObject)serializer.Deserialize(result.CreateReader());

    myObjects.Add(myObject);
}

问题是上面的代码非常慢。遍历400个“返回”元素需要6秒。 可能建议在foreach循环外运行XmlSerializer Deserialize方法,但是我无法通过以下代码使用它:

var file = @"C:\Data\example_response.xml";
var xdoc = XDocument.Load(file);
var myNamespace = "http://myurl.com";
var results = xdoc.Descendants(XName.Get("myResponse", myNamespace)).ElementAt(0).ToString();

XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.Namespace = myNamespace;
xRoot.ElementName = "myResponse";
xRoot.IsNullable = true;

var serializer = new XmlSerializer(typeof(List<MyObject>), xRoot);
var output = (List<MyObject>)serializer.Deserialize(new StringReader(results));

上面的代码将导致一个空列表(可能是因为XmlSerializer无法将“ return”元素识别为“ MyObject”,但是我不想对生成的C#文件进行更改。

我觉得有一个非常简单的解决方案可以解决我的问题,但是我似乎无法弄清楚。

0 个答案:

没有答案