C# Deserialisieren --> Datei wird bereits verwendet!

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    C# Deserialisieren --> Datei wird bereits verwendet!

    Hallo,
    Ich benutze gerade zum ersten mal einen Serialisiere um eine Klasse zu serialisieren. Dabei ist sie nicht einmal verschlüsselt. Wenn ich allerdings meinen Code zum Deserialisieren laufen lasse wird die Datei von einem anderen Prozess verwendet...
    Ich finde den Fehler nicht da ich alle Filestreams die aktuelle am laufen sind schließe!.

    Danke schon mal ;D

    LG Wolf

    C#-Quellcode

    1. ​using System;
    2. using System.Collections.Generic;
    3. using System.IO;
    4. using System.Linq;
    5. using System.Runtime.Serialization.Formatters.Binary;
    6. using System.Text;
    7. using System.Threading.Tasks;
    8. namespace test_Ser
    9. {
    10. [Serializable()]
    11. class User
    12. {
    13. public string nick;
    14. public string website;
    15. public string nachname, vorname;
    16. public decimal alter;
    17. public void save(string path)
    18. {
    19. FileStream save = new FileStream(path, FileMode.Create);
    20. BinaryFormatter BF = new BinaryFormatter();
    21. BF.Serialize(save, this);
    22. save.Flush();
    23. save.Close();
    24. }
    25. public User load(string path)
    26. {
    27. FileStream load = new FileStream(path, FileMode.Open);
    28. BinaryFormatter BF = new BinaryFormatter();
    29. return (User)BF.Deserialize(load);
    30. }
    31. }
    32. }
    wenn du mit streams arbeitest, benutzt am besten using dafür:

    C#-Quellcode

    1. using(FileStream save = new FileStream(path, FileMode.Create))
    2. {
    3. BinaryFormatter BF = new BinaryFormatter();
    4. BF.Serialize(save, this);
    5. }

    Nun zu deinem Fehler.
    Close mag zwar den Stream schließen, gibt die Ressourcen aber nicht frei. Dazu musst du schon .Dispose() aufrufen.
    Und hier kommt nun das using ins Spiel. Das macht dass volkommen automatisch für dich.
    Auch musst du den Stream nicht mehr flushen, das macht das dispose, also das using auch für dich:
    referencesource.microsoft.com/…b/R/8270a043211dafd8.html
    Ok habe es jetzt danke ;D

    C#-Quellcode

    1. ​using System;
    2. using System.Collections.Generic;
    3. using System.IO;
    4. using System.Linq;
    5. using System.Runtime.Serialization.Formatters.Binary;
    6. using System.Text;
    7. using System.Threading.Tasks;
    8. namespace test_Ser
    9. {
    10. [Serializable()]
    11. class User
    12. {
    13. public string nick;
    14. public string website;
    15. public string nachname, vorname;
    16. public decimal alter;
    17. public void save(string path)
    18. {
    19. using (FileStream save = new FileStream(path, FileMode.Create))
    20. {
    21. BinaryFormatter BF = new BinaryFormatter();
    22. BF.Serialize(save, this);
    23. }
    24. }
    25. public User load(string path)
    26. {
    27. using (FileStream load = new FileStream(path, FileMode.Open))
    28. {
    29. BinaryFormatter BF = new BinaryFormatter();
    30. return (User)BF.Deserialize(load);
    31. }
    32. }
    33. }
    34. }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Wolf066“ ()

    Du kannst auch mal in Singleton, Serialisierung (Json, Xml) und Databinding ohne Dataset reingucken, da habich für vb Extensions reingemacht, die die Serialisiererei ein für allemal abhandeln - sofern es sich um ein serialisierbares Objekt handelt.
    Eine Extension verwendet XmlSerializer, die andere - wie du - den BinaryFormatter.