XML сериализует большие коллекции объектов - PullRequest
0 голосов
/ 20 августа 2009

Каков наилучший способ сериализации большой коллекции объектов? Я пытаюсь сериализовать и проверить по схеме большую коллекцию элементов, около 70 000 элементов в c #.

XML-файл не создан. Я пробовал с 1000 предметов, он отлично работает с меньшим количеством предметов.

public void SerializeObject( Ojbect MyObj)
{
  XmlSerializer serializer = new XmlSerializer(MyObj.GetType());

  StreamWriter sw = new StreamWriter(“c:\file.xml”);
  serializer.Serialize(streamWriter, myObj);
  sw.Flush();
  sw.Close();
}

public void Validate()
{
     XmlSchema xmlSchema = “c:\myschema.xsd”
     XmlReaderSettings xmlReaderSettings = new XmlReaderSettings();
     xmlReaderSettings.ValidationType = ValidationType.Schema;
     xmlReaderSettings.Schemas.Add(xmlSchema);

     XmlReader xmlReader = XmlReader.Create(xmlStream, xmlReaderSettings);
     while (xmlReader.Read())
     {
         //do some stuff
     }
}

1 Ответ

1 голос
/ 20 августа 2009

Мы провели некоторый бенчмаркинг для некоторой работы, которую мы выполняем, и обнаружили, что XmlSerialiser работает быстрее, чем использование XmlReader для больших файлов XML, но не для маленьких. Я подозреваю, что XmlValidatingReader, вероятно, будет довольно быстрым. Возможно, вам придется провести свой собственный сравнительный анализ с образцами ваших данных.

Я нашел этот код в сети где-то, чтобы выполнить проверку xsd на фрагмент XML, с несколькими настройками он может работать и для вас.

 public static bool Validate(string xsd, string xmlFrag)
    {
        if (string.IsNullOrEmpty(xmlFrag))
            return false;

        Trace.Indent();

        XmlValidatingReader reader = null;
        XmlSchemaCollection myschema = new XmlSchemaCollection();
        ValidationEventHandler eventHandler = new ValidationEventHandler(ShowCompileErrors);

        try
        {
            //Create the XmlParserContext.
            XmlParserContext context = new XmlParserContext(null, null, "", XmlSpace.None);

            //Implement the reader. 
            reader = new XmlValidatingReader(xmlFrag, XmlNodeType.Element, context);
            //Add the schema.
            myschema.Add("", xsd);

            //Set the schema type and add the schema to the reader.
            reader.ValidationType = ValidationType.Schema;
            reader.Schemas.Add(myschema);

            while (reader.Read())
            {
            }

            Trace.WriteLine("Completed validating xmlfragment");
            return true;
        }
        catch (XmlException XmlExp)
        {
            Trace.WriteLine(XmlExp.Message);
        }
        catch (XmlSchemaException XmlSchExp)
        {
            Trace.WriteLine(XmlSchExp.Message);
        }
        catch (Exception GenExp)
        {
            Trace.WriteLine(GenExp.Message);
        }
        finally
        {
            Trace.Unindent();
        }
        return false;

    }
    public static void ShowCompileErrors(object sender, ValidationEventArgs args)
    {
        Trace.WriteLine("Validation Error: {0}", args.Message);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...