保存和加载信息的最简单方法c#

Posted

技术标签:

【中文标题】保存和加载信息的最简单方法c#【英文标题】:Simplest way to save and load information c# 【发布时间】:2016-08-04 14:59:55 【问题描述】:

我有一个 WPF 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;
    

【问题讨论】:

"但是它不起作用" 为什么它不起作用? 定义“不工作”。你可以说得更详细点吗?您期望发生什么以及实际发生什么?此外,您为什么不为此使用标准的 .NET 序列化器/反序列化器之一?为什么要重新发明***? 以上代码与WPF无关。 最好更具体。发生任何异常,您是否调试过,您究竟要保存到什么位置? 【参考方案1】:

你说的“不工作”有点不清楚,但我建议你只使用标准的 .NET 序列化/反序列化库,而不是试图重新发明***。这里没有必要做任何定制。请参阅以下内容:https://msdn.microsoft.com/en-us/library/mt656716.aspx

附带说明一下,您为什么使用 getX() 和 setX() 方法而不是属性?它不是标准的 C#。例如:

private string productName;

public string getProductName()

    return productName;


public bool setProductName(string inputProductName)

    productName = inputProductName;
    return true;

应该是

public string ProductName

    get;
    set;

我猜你的代码不能正常工作的原因之一是它有多个刺眼竞争条件。例如,您的所有 3 个写入都是异步的,并且在另一个之后立即触发;不能保证当你开始下一个时前一个会完成。我什至不清楚您是否保证以特定顺序编写行(您在反序列化逻辑中认为是这种情况)。您也完全有可能(实际上很可能)在写操作的过程中关闭文件。

我还建议为文件流设置一个“使用”块。

【讨论】:

以上是关于保存和加载信息的最简单方法c#的主要内容,如果未能解决你的问题,请参考以下文章

传递信息并从另一个线程通知一个线程的最简单方法

将数据从父表和子表加载到 DataGridView 的最简单方法,可以进行排序

使用 C# 从 RTMP 服务器获取和播放音频流的最简单方法是啥?

在 c# 4.0 中执行火灾和忘记方法的最简单方法

使用 IPC 在 Python 和 C# 之间进行通信的最简单方法?

在 C# 中处理关联数组的最简单方法是啥?