LiteDb v2.0.50727获取含Dictionary的Collection时崩溃问题求助
问题根因
你遇到的崩溃是适配.NET Framework 3.5的LiteDb 2.x版本的已知限制:默认不支持自定义类作为Dictionary的键类型。序列化写入时虽然可以生成BSON结构,但反序列化环节无法将BSON的字符串键自动映射回stig.Control类实例,直接触发运行时错误。
可行解决建议
替换Dictionary键类型(改造成本最低)
将Public Property ControlGroups As new Dictionary(Of stig.Control, List(Of stig.Control))修改为Dictionary(Of ObjectId, List(Of stig.Control)),使用Control类自带的唯一ID作为键。写入时直接存入Control的ID,读取后如果需要关联Control实例,遍历Controls列表匹配ID即可,完全兼容旧版本LiteDb的序列化规则。
自定义序列化逻辑
给ControlGroups字段添加[BsonIgnore]标记,新增一个字符串类型的字段用来存储序列化后的字典数据。写入时自行将ControlGroups序列化为JSON字符串存入新增字段,读取时再自行反序列回原字典结构,绕开LiteDb对复杂键字典的默认解析逻辑。
升级小版本修复
可以尝试升级到适配.NET Framework 3.5的最新LiteDb 2.0.6版本,该版本修复了多个复杂集合类型的反序列化bug,无需修改业务代码就有可能解决该问题。
辅助排查方案
如果需要定位具体报错,可以在GetCollection调用外层添加Try Catch逻辑,将异常的堆栈信息、内部异常内容写入本地日志文件,不需要依赖宿主程序的调试环境就能拿到准确报错原因。
内容的提问来源于stack exchange,提问作者stigzler

