2016-08-04 47 views
-3

Ich habe eine WPF C# -Anwendung. Ich brauche es, um 'Produkte' speichern zu können. Diese Produkte haben einen Produktnamen, einen Kundennamen und einen Firmwarestand. Dies ist mein aktueller Code zum Speichern und Laden, aber es funktioniert nicht. Ich denke, einen anderen Ansatz, um es zu versuchen, alle zusammen:Einfachste Möglichkeit zum Speichern und Laden von Informationen C#

public class Product 
{ 
    private string productName; 
    private string customerName; 
    private string firmwareLocation; 

    public string getProductName() 
    { 
     return productName; 
    } 

    public bool setProductName(string inputProductName) 
    { 
     productName = inputProductName; 
     return true; 
    } 

    public string getCustomerName() 
    { 
     return customerName; 
    } 

    public bool setCustomerName(string inputCustomerName) 
    { 
     customerName = inputCustomerName; 
     return true; 
    } 

    public string getFirmwareLocation() 
    { 
     return firmwareLocation; 
    } 

    public bool setFirmwareLocation(string inputFirmwareLocation) 
    { 
     inputFirmwareLocation = firmwareLocation; 
     return true; 
    } 

    public Product(string inProductName, string inCustomerName, string inFirmwareLocation) 
    { 
     inProductName = productName; 
     inCustomerName = customerName; 
     inFirmwareLocation = firmwareLocation; 
    } 

    public void Save(TextWriter textOut) 
    { 
     textOut.WriteLineAsync(productName); 
     textOut.WriteLineAsync(customerName); 
     textOut.WriteLineAsync(firmwareLocation); 
    } 

    public bool Save(string filename) 
    { 
     TextWriter textOut = null; 
     try 
     { 
      textOut = new StreamWriter(filename); 
      Save(textOut); 
     } 
     catch 
     { 
      return false; 
     } 
     finally 
     { 
      if (textOut != null) 
      { 
       textOut.Close(); 
      } 
     } 

     return true; 
    } 

    public static Product Load (string filename) 
    { 
     Product result = null; 
     System.IO.TextReader textIn = null; 

     try 
     { 
      textIn = new System.IO.StreamReader(filename); 
      string productNameText = textIn.ReadLine(); 
      string customerNameText = textIn.ReadLine(); 
      string firmwareLocationText = textIn.ReadLine(); 
      result = new Product(productNameText, customerNameText, firmwareLocationText); 
     } 
     catch 
     { 
      return null; 
     } 
     finally 
     { 
      if (textIn != null) textIn.Close(); 
     } 
     return result; 
    } 
} 

}

+8

"_wie auch immer es funktioniert_" Warum es nicht funktioniert? –

+2

Definieren Sie "nicht funktioniert." Kannst du genauer sein? Was erwarten Sie und was passiert eigentlich? Warum benutzen Sie nicht einfach einen der Standard-.NET-Serialisierer/Deserialisierer? Warum erfinden Sie das Rad neu? – EJoshuaS

+3

Der obige Code hat nichts mit WPF zu tun. – mechanic

Antwort

2

Es ist ein wenig unklar, was Sie unter „nicht funktioniert“, aber ich würde vorschlagen, dass Sie nur den Standard verwenden. NET-Serialisierungs-/Deserialisierungsbibliotheken dafür, anstatt zu versuchen, das Rad neu zu erfinden. Es ist nicht nötig, hier etwas Brauchbares zu tun. Siehe folgendes: https://msdn.microsoft.com/en-us/library/mt656716.aspx

Als eine Randnotiz, warum verwenden Sie getX() und setX() Methoden anstelle von Eigenschaften? Es ist kein Standard C#. Zum Beispiel ist die folgende: nicht funktioniert

private string productName; 

public string getProductName() 
{ 
    return productName; 
} 

public bool setProductName(string inputProductName) 
{ 
    productName = inputProductName; 
    return true; 
} 

sollte

public string ProductName 
{ 
    get; 
    set; 
} 

Ich vermute, dass einer der Gründe, Ihr Code ist, dass es mehrere grell Rennbedingungen hat. Zum Beispiel sind alle 3 Schreibvorgänge asynchron und werden direkt nacheinander abgefeuert. Es gibt keine Garantie, dass die vorherige ausgeführt wird, wenn Sie die nächste starten. Es ist mir nicht einmal klar, dass Sie garantiert die Zeilen in einer bestimmten Reihenfolge schreiben werden (was in Ihrer Deserialisierungslogik der Fall ist). Es ist auch völlig möglich (wahrscheinlich, tatsächlich), dass Sie die Datei mitten in Ihren Schreiboperationen schließen.

Ich würde auch einen "using" -Block für die Dateiströme vorschlagen.