如何在C#中将Dictionary转换为二进制序列化

时间:2017-10-12 04:43:40

标签: c# dictionary serialization

我有以下代码将Dictionary转换为Binary Serialize

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转换为二进制序列化有问题。 将字典传递给二进制序列化时出现以下错误。 我已在[Serializeable]

之上应用了ConnectionManager标记
  

{“在程序集'mscorlib中键入'System.Threading.AutoResetEvent',   Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'是   没有标记为可序列化。“}

enter image description here

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

1 个答案:

答案 0 :(得分:1)

这是典型的XY problem。您不应该尝试序列化充满瞬态成员的复杂ConnectionManager类,例如事件句柄。 Yous应该从相应的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帐户类型添加一些类型属性。

然后在反序列化后,您只需在空AddImapConnection上调用AddPop3ConnectionConnectionManager即可为管理器对象提供必要的初始化。