【问题标题】:What to use instead ini in C#在 C# 中使用什么代替 ini
【发布时间】:2013-12-03 00:27:05
【问题描述】:

必须有一个程序可以生成 WORD 文档(但这不是重点)。它通过用户在程序中写入的数据生成文档。有时需要关闭应用程序并做一些其他工作,而用户不想失去所有进度。在这里,我们必须保留用户输入的所有“更改”。以前,我已经保存了所有 .ini 文件(在指令 http://www.codeproject.com/Articles/1966/An-INI-file-handling-class-using-C 下),这对我来说已经足够测试了,但在实际情况下,ini 是不够的,因为如果我用多行保存文本框,那么记录到 inin 文件就会出错,并且在读取 ini 文件时 - 读取的只是第一行,然后只有前 255 个字符。

以下是应保存的示例:

  1. 有关所有选中复选框单选按钮等的信息(在 INI 示例,我在 CHECKOUTS 和 COMPARING 部分显示)
  2. 主窗体(MAIN 部分)上所有文本框的数据
  3. 最重要的是,“实现”和“屏幕”类的对象。

现在关于“实现”类:每个实现都可能有一个名称、描述、状态和指向屏幕截图的链接列表。为此,我创建了一个列表框,其中包含每个实现的屏幕截图列表 (ScreenList),并为所有实现创建了一个单独的列表框。即,当我填充数据时,我将对象存储在列表框中,然后如果需要,我可以访问它。当我将所有实现的列表保存到 ini 中时,我首先写入所有实现的数量,以便能够在循环(for、while 等)中访问每个对象(全部在 INI 和代码示例中:部分 IMPLEMENTATIONS, IMPLEMENTATION_n 。 ..)

问题是:如何保存这些数据?据我所知,微软已经放弃了 ini 并使用了 xml,但我无法正确地用谷歌搜索它。有人建议我在 xml 中使用数据序列化,但据我所知 - 序列化仅用于类的一个对象,而且我有很多这些对象,否则我仍然有所有复选框的值和更多。即我需要保存所有控件的值,类的所有对象实现和屏幕,然后读取这些值并将它们写回它们被取走的地方。该怎么做?

代码示例:

//........save object to listbox
Implement imp = new Implement(impName.Text, impDescr.Text, impStatus.Text, ScreenList);
listBox1.Items.Add(imp);
//......

//in implement class, Screens is list of screenshots that is get from another listbox
private List<string> _Screens = new List<string>();
public Implement(string Name, string Description, string Status, ListBox Screen)
{
    _Name = Name;
    _Description = Description;
    _Status = Status;
    for(int i=0;i<Screen.Items.Count;i++)
    {
        _Screens.Add(Screen.Items[i].ToString());
    }
}

//....getting access to implementation
Implement imp = (Implement)listBox1.SelectedItem;
....

初始化示例:

[MAIN]
Languages=Polish
Comment=Comment lalarar larl alrlalrl
Status=Correct
[CHECKOUTS]
Enable=True
SLDoc=False
SLDocTab=True
SaveDoc=True
LoadDoc=False
SendDoc=False
Correctly=True
CorrNum=50
[COMPARING]
Enable=True
NoDif=False
Declar=True
UnDecl=False
UnDeclDESCR=
[IMPLEMENTATIONS]
COUNT=2
[IMPLEMENTATION_0]
Name=Implement 1 CORRECT
Descr=text text test text
Status=Correct
ScreenCount=2
Screen_0=C:\1.png
Screen_1=C:\2.png
[IMPLEMENTATION_1]
Name=IMPLEMENT 2 INCORRECT
Descr=lala
Status=Incorrect
ScreenCount=2
Screen_0=C:\2.png
Screen_1=C:\3.jpg
[SCREENS]
COUNT=2
[SCREEN_0]
Descr=Screen 1
Screen=C:\1.png
[SCREEN_1]
Descr=Screen 2
Screen=C:\1.png

【问题讨论】:

  • 你不觉得这个问题有点太宽泛了吗?
  • 您是否尝试过使用 app.config 文件?
  • 当您想要获得可读和分层的序列化时,看起来像是“在哪里使用 xml”的一个很好的例子......
  • 使用 app.config 文件代替 INI...

标签: c# winforms serialization settings ini


【解决方案1】:

如果我理解正确,你应该看看 c# 中的 settings 机制。

希望this chapter of MSDN有用。

【讨论】:

    【解决方案2】:

    你要做的是创建某种Settings 对象。这应该是一个对于您喜欢的每个设置(例如public string Language {get; set; })具有特定属性(或嵌套值的类)的类,或者您可以通过使用两个字典Dictionary&lt;string, string&gt;(对于简单值)采取更通用的方式,@ 987654326@(复杂类型的递归结构)。

    然后您的表单应该能够创建这样一个设置对象并用重新创建当前状态所需的所需数据填充它,并且它应该能够获取这样一个设置对象并将其当前状态更改为该设置对象将所有内部变量设置为此对象内的值。

    下一步是使用XML serializationData Contract 或任何您喜欢的方式使该对象可序列化。然后,您可以将此对象写入/加载到磁盘/从磁盘加载,然后将其推送到需要此状态的类中。

    【讨论】:

      猜你喜欢
      • 2016-11-08
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多