none
ein Projekt kann eine Datei lesen - ein anderes nicht... RRS feed

  • Frage

  • Hallo,

     

    ich habe folgendes Problem: Ich habe ein Projekt erstellt, dass via "Serialize" und Co die Daten in eine Datei schreibt. Das Projekt kann die Daten auch problemlos wieder lesen. Wenn ich allerdings ein zweites Projekt in dem Projektmappenexplorer erstelle, die Klasse zum Serialisieren kopiere und versuche die Datei einzulesen, erhalte ich eine Exeption. Habe schon lange über das Problem gegrübelt, gegooglet und den Code mehrfach verglichen. Mir fällt einfach nicht ein wo ich einen Fehler gemacht haben könnte. Hier mal der Code der "Datenklasse" und danach der für die Datenverarbeitung:

     

    Code Snippet

    [Serializable]

    class data

    {

    /*

    * _dLastedate = letztes Ausfhrungsdatum

    * _sEventname = Name/Bezeichnung der Aktion

    * _iLimit = Limit fr Erinnerung

    */

    private DateTime _dLastdate;

    private string _sEventname;

    private int _iLimit;

    public data()

    {

    //_dLastdate = last;

    //_sEventname = ename;

    //_iLimit = limit;

    }

    public DateTime dLastdate

    {

    get { return _dLastdate; }

    set { _dLastdate = value; }

    }

    public string sEventname

    {

    get { return _sEventname; }

    set { _sEventname = value; }

    }

    public int iLimit

    {

    get { return _iLimit; }

    set { _iLimit = value; }

    }

     

    }

     

     

     

    Code Snippet

    class DataServ

    {

    public ArrayList evs = new ArrayList();

    public void laden()

    {

    // Konfigurationsdatei auslesen

    int max;

    FileStream rConfig = new FileStream("W-Config.dat", FileMode.OpenOrCreate, FileAccess.Read);

    BinaryFormatter rCReader = new BinaryFormatter();

    if (rConfig.Length > 0)

    {

    max = (int) rCReader.Deserialize(rConfig);

    FileStream rStream = new FileStream("W-Events.dat", FileMode.OpenOrCreate, FileAccess.Read);

    BinaryFormatter binReader = new BinaryFormatter();

    data temp = new data();

    if (rStream.Length > 0)

    {

    for (int i = 0; i < max; i++)

    temp = (data)binReader.Deserialize(rStream);

    // evs.Add((data)binReader.Deserialize(rStream));

    }

    rStream.Close();

    }

    else max = 0;

    rConfig.Close();

    }

    public void speichern()

    {

    FileStream wStream = new FileStream("W-Events.dat", FileMode.OpenOrCreate, FileAccess.Write);

    BinaryFormatter binWriter = new BinaryFormatter();

    for (int i = 0; i < evs.Count; i++)

    binWriter.Serialize(wStream, evs[i]);

    wStream.Close();

    FileStream rwConfig = new FileStream("W-Config.dat", FileMode.OpenOrCreate, FileAccess.Write);

    BinaryFormatter RCWriter = new BinaryFormatter();

    RCWriter.Serialize(rwConfig, evs.Count);

    rwConfig.Close();

    }

     

     

    Ich vestehe nun nicht, warum das auslesen der Datei in dem einen Projekt funktioniert und in dem anderen Projekt nicht...

     

    Bitte um Hilfe,

     

    Danke und Gruß,

     

    Michael

    Freitag, 27. Juni 2008 21:40

Antworten

  • Du könntest das Speichern und Laden sowie die Klassen in eine DLL auslagern. Das scheint mir sowieso sinnzumachen, wenn du für zwei anwendungen zwei mal den gleichen Code brauchst.
    Damit hättest du das Problem umgangen.

    Montag, 7. Juli 2008 11:39

Alle Antworten

  • Kopierst du beide klassen und arbeitest mit den exakt gleichen Datenstrukturen?

     

    Montag, 30. Juni 2008 16:14
  • Hallo,

     

    ich habe die Klassen über den Projektmappenexplorer hinzugefügt (kopiert). Die Datenstrukturen sind genau die gleichen. Daher verstehe ich auch nicht, dass das Problem auftritt.

     

    Gruß,

    Michael

     

    Montag, 30. Juni 2008 19:32
  • Hast du auch die Entsprechenden Verwese und Usings auf den system.xml.serialization Namespace gesetzt?

     

    lässt sich das zweite Projekt Compalieren oder geht selbst das nicht?
    Montag, 30. Juni 2008 20:01
  • Hallo,

     

    ja, die Verweise sind gesetzt (via Using). Das zweite Projekt läßt sich problemlos compilieren. Ausführen nur, wenn ich es als "Startprojekt" festlege. Aber dann auch problemlos. Der Fehler schein definitiv in dieser Zeit zu stecken:

     

    Code Snippet
    temp = (data)binReader.Deserialize(rStream);

     

     

    Wenn ich diese Zeile auskommentiere entsteht kein Laufzeitfehler - natürlich wird die Datei dann auch nicht eingelesen...

     

    Die Zeile funktionert allerdings in dem Projekt, dass die Datei erstellt hat völlig fehlerfrei (habe ich bereits mehrfach getestet).

     

    Gruß,

    Michael

     

     

    Dienstag, 1. Juli 2008 18:30
  •  

    Dann kopiert doch bitte die komplete Exception dieser Ausnahme hier rein. Die wird sicher weiterhelfen.
    Dienstag, 1. Juli 2008 18:33
  • Der Text der Exception lautet:

     

    Code Snippet
    System.Runtime.Serialization.SerializationException wurde nicht behandelt.
      Message="Die Assembly Wuselevents, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null kann nicht gefunden werden."
      Source="mscorlib"
      StackTrace:
           bei System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly()
           bei System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(BinaryAssemblyInfo assemblyInfo, String name)
           bei System.Runtime.Serialization.Formatters.Binary.ObjectMap..ctor(String objectName, String[] memberNames, BinaryTypeEnum[] binaryTypeEnumA, Object[] typeInformationA, Int32[] memberAssemIds, ObjectReader objectReader, Int32 objectId, BinaryAssemblyInfo assemblyInfo, SizedArray assemIdToAssemblyTable)
           bei System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryObjectWithMapTyped record)
           bei System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryHeaderEnum binaryHeaderEnum)
           bei System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
           bei System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
           bei System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
           bei System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)
           bei Wuselevents.DataServ.laden() in C:\Users\Michael\Documents\Visual Studio 2008\Projects\Wuselevents\Wusel-Notify\DataServ.cs:Zeile 30.
           bei Wuselevents.Form2..ctor() in C:\Users\Michael\Documents\Visual Studio 2008\Projects\Wuselevents\Wusel-Notify\Form2.cs:Zeile 19.
           bei Wuselevents.Program.Main() in C:\Users\Michael\Documents\Visual Studio 2008\Projects\Wuselevents\Wusel-Notify\Program.cs:Zeile 18.
           bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
           bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           bei System.Threading.ThreadHelper.ThreadStart()
      InnerException:

     

     

    Ich hoffe, das hilft.

     

    Gruß,

    Michael

    Dienstag, 1. Juli 2008 18:38
  • Hallo nochmals,

     

    habe weiter experimentiert, aber noch kein Ergebnis gefunden. Die Software verlangt ja offenkundig nach der Assembly mit der die Datendatei ursprünglich erstellt wurde. Es ist aber natürlich im Grunde Ziel, dass ich die Datendatei auch ohne die erste Anwendung öffnen kann. Irgendwie verstehe ich den Zusammenhang nicht.

     

    Hat jemand eine Antwort?

     

    Gruß,

    Michael

     

    Donnerstag, 3. Juli 2008 21:43
  • Du könntest das Speichern und Laden sowie die Klassen in eine DLL auslagern. Das scheint mir sowieso sinnzumachen, wenn du für zwei anwendungen zwei mal den gleichen Code brauchst.
    Damit hättest du das Problem umgangen.

    Montag, 7. Juli 2008 11:39
  • Hallo,

     

    Danke, das ist tatsächlich eine gute Idee (auf die ich wohl in der nächsten Zeit nicht selbst gekommen wäre...). Werde mal versuchen das Problem auf diese Art und Weise zu lösen.

     

    Gruß,

    Michael

    Montag, 7. Juli 2008 18:02
  • Du könntest das Speichern und Laden sowie die Klassen in eine DLL auslagern. Das scheint mir sowieso sinnzumachen, wenn du für zwei anwendungen zwei mal den gleichen Code brauchst.
    Damit hättest du das Problem umgangen.

    Ich habe das gleiche Problem wie @Wichmann.

    Hab auch diese Variante mittels DLL machen wollen, nur kann ich diese nicht mit der 'using' -direktive und mit Hilfe von Intellisence ins Projekt einbinden..Muß auch dazu sagen, ist meine erste DLL :)

    Meine Vorgehensweise :

    .) ich erstellte ein neues DLL Projekt und fügte meinen Code hinzu

    .) danach auf Projektmappe erstellen (bilde mir ein, er hatte zuerst keine DLL in den üblichen Ordner erstellt, bis nach einige male herumprobieren)

    .) Im eigentlichen Main-Projekt, fügte ich den Verweis für meine DLL hinzu.

    .) per using nicht zu finden.

    .) kopierte danach das DLL Projekt in mein Main Projekt und fügte es als Zweitprojekt in meinem Main-Projekt hinzu  dachte eventuell der falsche Ordner...

    .) vergebens. fügte die Nackte Dll Datei in meinen Mainprojekt hinzu und fügte den Verweis dieser Datei (wie auch bei jeden anderen Versuch) in mein     Mainprojekt wieder ein, nachdem ich vorher natürlich noch den 'alten' Verweis entfernt hatte.. Dabei lag die DLL im Mainprojektordner, sowie auch selbst kopiert im Debug Ordner..

    Bin mittlerweile am verzweifeln, eine im Prinzip ganz einfache Sache, die einen den Kopf verdreht !

    Von zwei Projekten aus, auf eine im BinaryFormat Serialisierte Datei zugreifen zu können. Das Mainprojekt tut erstellen/schreiben/lesen und das zweite Projekt nur lesen...und genau bei dem steh ich an..

    Mittwoch, 18. April 2012 11:08
  • Sorry, mir ist ein UUUURRRRRR peinlicher Fehler passiert !!!

    Hatte bei keiner Klasse 'public' angegeben, demnach kann man nicht mal den Namespace mit der 'using' direktive finden !!

    Ganz wichtig : "" public ""

    ;o)

    Donnerstag, 19. April 2012 05:25