2009-08-20 7 views
0

Quelle est la meilleure façon de sérialiser une grande collection d'objets? J'essaye de sérialiser et de valider par rapport à un schéma une grande collection d'éléments environ 70 000 éléments dans C#.XML Sérialiser de grandes collections d'objets

Le fichier XML n'est pas créé. J'ai essayé avec un millier d'articles, cela fonctionne bien avec moins d'articles.

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 
    } 
} 
+0

Et quel est le résultat? Est-ce rapide? Lent? –

+1

Ok, merci, ça en fait partie. Maintenant, vous devez nous montrer le code que vous utilisez pour sérialiser et valider. –

Répondre

1

Nous avons fait quelques analyses comparatives pour un travail que nous faisions et a constaté que la XmlSerialiser a travaillé plus vite que d'utiliser XmlReader pour les gros fichiers XML, mais pas pour les petits. Je suppose que le XmlValidatingReader serait probablement assez rapide. Vous devrez peut-être faire votre propre analyse comparative avec des échantillons de vos données.

J'ai trouvé ce code en ligne quelque part pour faire une validation de xsd par rapport à un fragment Xml, avec quelques réglages, cela peut aussi fonctionner pour vous.

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); 
    } 
+0

Merci David pour votre réponse, je vais essayer plus tard, je donne actuellement la génération/l'écriture du fichier XML ma priorité, comme nécessaire pour obtenir ces fichiers. Je peux choisir de ne pas valider si c'est trop de problème mais je pense qu'il est préférable de le faire. D'après mes recherches, il semble que XmlTextWriter soit le meilleur choix, mais tout l'exemple de code que j'ai vu jusqu'ici semble écrire manuellement chaque élément et chaque attribut. Est-ce la seule façon d'utiliser cette classe –

Questions connexes