XmlSerializer.Deserialize () работает слишком медленно с файлами размером более 1 МБ - .Net compact framework 3.5 sp1 - PullRequest
1 голос
/ 10 марта 2010

Я получил схему XML, для которой я использовал xsd.exe для создания класса FooClass.

Я получаю XML-запросы от хоста, которые я получаю из каталога, и использую XmlSerializer.Deserialize(), чтобы получить экземпляр моего FooClass.

Что ж, до сих пор это работало отлично, и все еще работает, но внезапно я начал получать файлы XML большего размера (около 300 КБ), и время, которое требуется для Deserialize(), неприемлемо! Загрузка того же XML-файла с XMLTextReader() занимает миллисекунды, а время десериализации составляет около 1 минуты и 30 секунд!

Так что я подумал, что я буду использовать XMLReader для чтения XML-файла и сборки FooClass самостоятельно! Но прежде чем я начну переделывать весь мой код, я хотел бы спросить вас, есть ли способ использовать XmlSerializer.Deserialize(), который был бы быстрее?

Я не уверен, что сборка XMLSerializer мне здесь сильно поможет?

вот мой код, который будет вызываться в цикле для каждого файла

using (MemoryStream ms = new MemoryStream(xmldata)
{
   XmlSerializer sz = new XmlSerializer(typeof(FooClass));
   foo = (FooClass)sz.Deserialize(ms);
} 

Спасибо заранее, AK

1 Ответ

0 голосов
/ 10 марта 2010

Вы пробовали новый DataContractSerializer в .NET 3.5? То, как вы используете его, в значительной степени совпадает с XmlSerializer; не знаю, будет ли он быстрее, но у него есть много других преимуществ по сравнению с XmlSerializer, таких как сериализация закрытых членов, отсутствие необходимости в конструкторе без параметров, возможность игнорировать свойства и т. д.

using (MemoryStream ms = new MemoryStream(xmldata))
{
    DataContractSerializer s = new DataContractSerializer(typeof(FooClass));
    FooClass c = s.ReadObject(ms) as FooClass;
}

Вам нужно будет добавить атрибут [DataContract] к определению FooClass, и вам не нужно этого делать, но я явно сообщаю сериализатору, какие элементы я хочу сериализовать, декорируя их [DataMember].

[DataContract]
public class FooClass
{
    public string IgnoreThisProperty { get; set; }

    [DataMember]
    public string SerialiseThisProperty { get; set; }
}
...