【发布时间】: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 个字符。
以下是应保存的示例:
- 有关所有选中复选框单选按钮等的信息(在 INI 示例,我在 CHECKOUTS 和 COMPARING 部分显示)
- 主窗体(MAIN 部分)上所有文本框的数据
- 最重要的是,“实现”和“屏幕”类的对象。
现在关于“实现”类:每个实现都可能有一个名称、描述、状态和指向屏幕截图的链接列表。为此,我创建了一个列表框,其中包含每个实现的屏幕截图列表 (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