【发布时间】:2015-02-09 19:05:38
【问题描述】:
我一直在开发一个可以在树视图控件中跟踪特定电子邮件的 Outlook 插件。打开和关闭 Outlook 时,树节点会被序列化/反序列化并通过流保存到文件中。我遇到的问题是当我在添加新的 TreeNodes 后关闭应用程序时,它并不总是序列化和保存。这似乎只有在我快速打开应用程序、添加一些节点并关闭时才会发生。当我在短时间内不打开和关闭时,它工作得很好。
我的代码如下,我认为非常简单。我相对缺乏经验,我想一定有一些我在这里没有遵循的基本规则。我的猜测是我没有正确使用流类??
((Outlook.ApplicationEvents_11_Event)Application).Quit += new Outlook.ApplicationEvents_11_QuitEventHandler(ThisAddIn_Quit);
private void PopulateTree()
{
try
{
using (Stream fileO = File.Open(@"Data.dat", FileMode.OpenOrCreate))
{
if (fileO.Length != 0)
{
BinaryFormatter bf = new BinaryFormatter();
object obj = bf.Deserialize(fileO);
TreeNode[] nodeList = (obj as IEnumerable<TreeNode>).ToArray();
Globals.ThisAddIn.myUserControl1.ResponseTree.Nodes.AddRange(nodeList);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
void ThisAddIn_Quit()
{
try
{
using (Stream file = File.Open(@"Data.dat", FileMode.Create))
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(file, Globals.ThisAddIn.myUserControl1.ResponseTree.Nodes.Cast<TreeNode>().ToList());
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
【问题讨论】:
-
每次都会调用 Quit 事件吗?您是否尝试调试代码?请参阅Shutdown Changes for Outlook 2010 了解更多信息。
-
感谢您的链接,它确认我订阅了正确的活动。这很奇怪,我只有在反复调试代码时才会遇到问题。我很肯定每次我退出时都会调用该事件。我唯一能做的就是树视图对象在它可以序列化之前从内存中消失,所以什么都没有保存?我想解决方案可能是在每次更改树视图时序列化并保存。
-
是的。尝试实现该场景。
标签: c# serialization vsto outlook-addin