Benutzer mit den meisten Antworten
ein Projekt kann eine Datei lesen - ein anderes nicht...

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 Ausfhrungsdatum
* _sEventname = Name/Bezeichnung der Aktion
* _iLimit = Limit fr 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 Snippetclass 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
Antworten
Alle Antworten
-
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 Snippettemp = (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
-
Der Text der Exception lautet:
Code SnippetSystem.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
-
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
-
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..