2011-01-07 2 views
1

J'ai remarqué que si je restais un objet dans le fichier en utilisant un Datacontrerserializer, si la longueur du nouveau xml est plus courte que le xml présent dans le fichier les restes du xml d'origine hors la longueur du nouveau xml restera dans le fichier et va casser le xml.Datacontractserializer n'écrase pas toutes les données

Quelqu'un at-il une bonne solution pour résoudre ce problème?

Voici le code que je utilise persister l'objet:

/// <summary> 
    /// Flushes the current instance of the given type to the datastore. 
    /// </summary> 
    private void Flush() 
    { 
     try 
     { 
      string directory = Path.GetDirectoryName(this.fileName); 
      if (!Directory.Exists(directory)) 
      { 
       Directory.CreateDirectory(directory); 
      } 

      FileStream stream = null; 
      try 
      { 
       stream = new FileStream(this.fileName, FileMode.OpenOrCreate); 
       for (int i = 0; i < 3; i++) 
       { 
        try 
        { 
         using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(stream, new System.Text.UTF8Encoding(false))) 
         { 
          stream = null; 

          // The serializer is initialized upstream. 
          this.serializer.WriteObject(writer, this.objectValue); 
         } 

         break; 
        } 
        catch (IOException) 
        { 
         Thread.Sleep(200); 
        } 
       } 
      } 
      finally 
      { 
       if (stream != null) 
       { 
        stream.Dispose(); 
       } 
      } 
     } 
     catch 
     { 
      // TODO: Localize this 
      throw; 
      //throw new IOException(String.Format(CultureInfo.CurrentCulture, "Unable to save persistable object to file {0}", this.fileName)); 
     } 
    } 

Répondre

5

Il est à cause de la façon dont vous ouvrez votre flux avec:

stream = new FileStream(this.fileName, FileMode.OpenOrCreate); 

Essayez d'utiliser:

stream = new FileStream(this.fileName, FileMode.Create); 

Voir la documentation FileMode.

+0

À la votre! Cela semble l'avoir réparé. J'ai été en proie à cela pendant les deux derniers jours. Je n'ai pas regardé assez attentivement les options FileMode. –

2

Je crois que cela est dû à l'utilisation FileMode.OpenOrCreate. Si le fichier existe déjà, je pense que le fichier est en cours d'ouverture et certaines parties des données sont remplacées par l'octet de début. Si vous passez à FileMode.Create, les fichiers existants seront écrasés.

+0

Je crains que Reddog ne vous a juste frappé. J'ai marqué votre réponse comme utile de toute façon. à votre santé! –

Questions connexes