【问题标题】:Saving values for later use保存值以备后用
【发布时间】:2018-03-06 02:39:34
【问题描述】:

案例:我正在创建一个从 plc 中读取值的程序。为了读取这些值,需要填写一个配置选项卡。此配置选项卡将他的所有值放入一个数组列表中。如果程序关闭,它会丢失他所有的配置数据,我想创建一个函数来保留这个配置数据。我对这些事情完全陌生,我很好奇你们是否有答案和/或示例代码。我正在考虑存储完整的数组列表,并在我打开这个 .whatever 文件时读出。

您可能已经看到,我已经创建了一个菜单。

数组列表名称 = allData。

arraylists 在名为 DataPerLabel 的对象中接受此数据。

配置选项卡:

类 DataPerLabel:

class DataPerLabel
{
    public String labelName;
    public String labelAdress;
    public String dataType;
    public bool monitor;

    public DataPerLabel(String labelName, String labelAdress, String dataType, bool monitor)
    {
        this.labelName = labelName;
        this.labelAdress = labelAdress;
        this.dataType = dataType;
        this.monitor = monitor;
    }

    public String getLabelName()
    {
        return labelName;
    }

    public String getLabelAdress()
    {
        return labelAdress;
    }

    public String getDataType()
    {
        return dataType;
    }

    public bool getMonitor()
    {
        return monitor;
    }
}

我想将此数组列表存储在 .ini 或 .txt 文件中

我现在已经尝试过了:

private void menuItemSave_Click(object sender, System.EventArgs e)
    {
        string yourFilePath = @"C:\\Users\\Gebruiker\\Desktop\\WindowsHMI\\";

        XmlSerializer serializer = new XmlSerializer(typeof(DataPerLabel));

        foreach (DataPerLabel configRecord in allData)
        {
            using (XmlWriter writer = XmlWriter.Create(yourFilePath, new XmlWriterSettings() { Indent = true }))
            {
                serializer.Serialize(writer, configRecord);
            }
        }
    }

给我错误:在 allDataPerLabel 上无法进行序列化,因为它没有没有参数的构造函数。

希望任何人都可以提供帮助,

谢谢

【问题讨论】:

  • 您应该考虑将文件保存到 app.config 或使用 ConfigurationManager 的用户配置文件中
  • 让我看看,正如我所说,我是全新的学生,所以还是谢谢!
  • 使用序列化很容易将整个数组列表存储在一个文件中,并在启动时使用反序列化再次加载它。但我宁愿接受@MarkusDeibel 将数据存储在配置文件中的建议。如果每个用户的配置选项卡中的数据不同,我会将数据存储为用户设置,如果每个用户都相同,我会将它们存储在配置文件中。
  • 用最快的解决方案回答你
  • 顺便说一句,ArrayList 是一个非泛型集合,几乎完全被List<T> 取代。我强烈建议您在几乎所有情况下都使用泛型集合。

标签: c# arraylist save ini


【解决方案1】:

您可以将数据保存为 xml 字符串:

List<DataPerLabel> _dataPerLabelList; // this is your data object.

.
.
.

// on saving:

XmlSerializer serializer = new XmlSerializer(typeof(List<DataPerLabel>));

using (XmlWriter writer = XmlWriter.Create(yourFilePath, new XmlWriterSettings() { Indent = true }))
{
       serializer.Serialize(writer, _dataPerLabelList);
}

.
.
.


// on loading your form:
XmlSerializer deserializer = new XmlSerializer(typeof(List<DataPerLabel>));

using (XmlReader reader = XmlReader.Create(yourFilePath))
{
      _dataPerLabelList = (List<DataPerLabel>)deserializer.Deserialize(reader);
}

注意:由于您的列表包含相同类型的对象,所以我认为没有必要使用ArrayList,您可以使用List&lt;DataPerLabel&gt;

【讨论】:

  • 加载表单时,如何将所有这些数据放入同一个arraylist allData?
  • 由于您的列表仅包含一种对象类型,因此我认为用户 List 而不是 ArrayList 更好。
【解决方案2】:

这边!

使用:

https://www.newtonsoft.com/json

存储列表:

List<DataPerLabel> lst = new List<DataPerLabel>();
string json = JsonConvert.SerializeObject(lst);
File.WriteAllText("path", json);

阅读列表:

string json = File.ReadAllText("path");
List<DataPerLabel> lst = JsonConvert.DeserializeObject<List<DataPerLabel>>(json);

【讨论】:

  • 我需要在什么类型的文件中存储 json 对象?还是它会自动创建一个?字符串路径 = @"C:\\Users\\Gebruiker\\Desktop\\WindowsHMI\\";不能正常工作吗?
  • 它会创建一个txt文件,你应该指定路径\\文件名
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多