2012-04-08 3 views
0

Okay, ich habe eine Klasse „EIR“, die eine Liste von seiner Basisklasse „ExpenseReport“ als solche basiert:„Kann nicht das Objekt von Typ‚System.String‘‚Payroll.EIR‘zu geben“

using System; 
using System.Collections.Generic; 
using System.Runtime.Serialization.Formatters.Binary; 
using System.Runtime.Serialization; 
using System.IO; 
using System.Linq; 
using System.Text; 

namespace Payroll 
{ 
    [Serializable] 
    public class EIR : List<ExpenseItem> 
    { 

    public void WriteToFile(string filename) 
     { 
      try 
      { 
       BinaryFormatter formatter = new BinaryFormatter(); 
       FileStream stream = new FileStream("D:\\myExpensesUpdated.bin", FileMode.Create, FileAccess.Write, FileShare.None); 
       formatter.Serialize(stream, filename); 
       stream.Close(); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("Unable to serialize Expenses: {0}", ex.Message); 
      } 
     } 

     public static EIR ReadFromFile(string filename) 
    { 
     EIR iRost = new EIR(); 
     try 
     { 
      BinaryFormatter formatter = new BinaryFormatter(); 
      FileStream stream = new FileStream("D:\\myExpensesUpdated.bin", FileMode.Open, FileAccess.Read, FileShare.Read); 
      iRost = (EIR)formatter.Deserialize(stream); 

     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Unable to deserialize Expenses: {0}", ex.Message); 
     } 

     return iRost;    
    }    
     } 
    } 
} 

Dieser Teil ist, wo Readfromfile ich ein Problem habe:

im Hauptprogramm wird dieser Teil versucht Readfromfile aufrufen und neu aktualisierten Elemente angezeigt werden, aber ich bekomme die Fehlermeldung „Kann nicht Objekt des Typs‚System werfen .String 'um' Payroll.EIR 'einzugeben. "

try 
     { 
      EIR expensesUpdated = EIR.ReadFromFile("D:\\myExpensesUpdated.bin"); 
      foreach (var e in expensesUpdated) Console.WriteLine("Updated: {0}", e.ToString()); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

Wie erhalte ich die iRost zum Payroll.EIR zu werfen, die eine Klasse? Gibt es eine Möglichkeit, eine serialisierte Zeichenfolge in eine Klasse zu konvertieren?

+0

'formatter.Serialize (Strom, Dateiname)' – leppie

Antwort

1

Ihr Problem ist bereits in WriteToFile Funktion, wo Sie tatsächlich den Dateinamen anstelle der Klasse serialisieren. Ich habe es nicht ausprobiert, aber das sollte funktionieren:

public void WriteToFile(string filename) 
{ 
    try 
    { 
     BinaryFormatter formatter = new BinaryFormatter(); 
     FileStream stream = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None); // filename parameter instead of fixed path 
     formatter.Serialize(stream, this); // class instance instead of filename parameter 
     stream.Close(); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Unable to serialize Expenses: {0}", ex.Message); 
    } 
} 

public static EIR ReadFromFile(string filename) 
{ 
    EIR iRost = new EIR(); 
    try 
    { 
     BinaryFormatter formatter = new BinaryFormatter(); 
     FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read); // filename parameter instead of fixed path 
     iRost = (EIR)formatter.Deserialize(stream); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Unable to deserialize Expenses: {0}", ex.Message); 
    } 

    return iRost;    
}    

Sind Sie sicher, dass es eine gute Idee, still alle Ausnahmen abfangen und schreiben Sie einfach eine Nachricht an die Konsole?

+0

BOOM geht das Dynamit! Beeindruckend. Es war nur eines dieser wirklich offensichtlichen Dinge, aber ich war so fest davon ausgegangen, dass es in der Deserialisierungsmethode geschah ... DANKE! –

Verwandte Themen