【问题标题】:How to convert Dictionary into Binary Serialize in C#如何在 C# 中将字典转换为二进制序列化
【发布时间】:2017-10-12 04:43:40
【问题描述】:

我有以下代码将字典转换为二进制序列化

private IDictionary<string, ConnectionManager> dictionary = new SortedDictionary<string, ConnectionManager>();
ConnectionManager conn;
dictionary.Add("testid", conn = new ConnectionManager());
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(@"c:\test1.txt",
FileMode.Create,FileAccess.Write, FileShare.None);
formatter.Serialize(stream, dictionary);

详细看这里的类代码

ConnectionManager.cs

https://github.com/Sicos1977/MailKitImapIdler/tree/master/MailKitImapIdler

我在将 Dictionary 转换为二进制序列化时遇到问题。 将字典传递到二进制序列化时出现以下错误。 我已经在ConnectionManager 类的顶部应用了[Serializeable] 标签

{"在程序集 'mscorlib 中键入 'System.Threading.AutoResetEvent', 版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089' 是 未标记为可序列化。"}

请建议我,我该如何解决我的问题。感谢您宝贵的时间。谢谢。

【问题讨论】:

  • 请提供简短而完整的代码如何重现此问题。
  • 尝试将NonSerialized 属性添加到您的AutoResetEvent 成员。
  • ConnectionManagerIdle 类有 1248 行代码。你可以在这里看到名为 ConnectionManager.cs github.com/Sicos1977/MailKitImapIdler/tree/master/… 的类
  • 那么问题可能应该是 你为什么要序列化 ​​Connection 对象? 你的错误来自复杂类的某些成员包含 AutoResetEvent 的事实显然是不可序列化的。
  • 然后您应该创建类似ConnectionConfiguration 类的所有必需成员(用户名、密码等)并序列化这些简单类的数组,这应该是一项微不足道的任务。然后在您的程序再次启动并反序列化您的数组后,您应该使用它来创建所有 ConnectionManager 对象。

标签: c# dictionary serialization


【解决方案1】:

这是一个典型的XY problem。您不应该尝试序列化复杂的 ConnectionManager 类,其中包含瞬态成员,例如事件句柄。您应该从各自的 Connection 类中选择必要的配置成员并仅序列化那些。

例如,您的代码可能如下所示:

[Serializable]
ConnectionConfiguration
{
    public string UserName { get; set; }
    public string Password { get; set; }
    public string Host { get; set; }
    public int Port { get; set; }

    // some other members might follow here
}

然后你只序列化和反序列化这些对象的数组。您还可以添加一些具有 POP3/IMAP 帐户类型的类型属性。

然后在反序列化之后,您只需在空的ConnectionManager 上调用AddImapConnectionAddPop3Connection,这为管理器对象提供了必要的初始化。

【讨论】:

  • 你能解释一下,如果我们在字典中添加 ConnectionConfiguration 对象,我们会在那里管理连接吗?
  • 为什么要使用字典来管理配置?简单的平面阵列对你来说绝对足够了。如果您需要一些命名,您只需添加属性Name 并为您自己的配置命名。
  • @adnan 这是一个单独的责任。想象ConnectionConfiguration类就像一张电影票:它有屏幕号,电影,座位号等。现在,你不用它来看电影,而是把它交给指导你的工作人员到屏幕和您的座位,以及播放电影的人。配置类是门票,连接管理器是电影院。
  • @adnan 您要存储的“数据”是您的 ConnectionManager 的配置数据,对吧?服务器 IP 和凭据之类的东西?
  • 我们在谈论什么状态?您能否详细说明此内容并命名您要保存的连接属性?请注意,您永远无法恢复具有大量瞬态的复杂对象的原始状态
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 2018-09-28
  • 2010-10-03
  • 1970-01-01
  • 2019-02-28
  • 2019-08-29
相关资源
最近更新 更多