【问题标题】:Deserialization of Expando Object in MongoMongo中Expando对象的反序列化
【发布时间】:2014-04-23 20:26:25
【问题描述】:

我在 Mongo-C# 环境中并使用 10Gen Mongo 驱动程序。当我尝试反序列化 Mongo 文档中的数据时,当它有一个子文档并且该子文档不是强类型时,我遇到了一个问题。换句话说,如果子文档是一个 Expando 或只是一个匿名对象(),那么它在反序列化时会给出错误,并出现以下错误:

System.IO.FileFormatException:一个文档被反序列化为 System.Object 必须为空。

我们可以在 Mongo 读/写之前和之后放置一个过滤器,它将我的 Object 即时转换为 BSONDocument,但我认为 BSOnDocument 和(Expando 或匿名类型)之间没有可用的转换。

编写自定义反序列化工具听起来工作量太大。我只是想知道是否有人以前遇到过这个问题以及他们是如何处理这个问题的?

【问题讨论】:

    标签: c# mongodb deserialization


    【解决方案1】:

    目前,由于 10gen 驱动程序基于 .NET 3.5,我们不支持动态对象。目前,处理此问题的方法是使用 ExtraElements 成员。你可以在这里阅读:http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial#CSharpDriverSerializationTutorial-Supportingextraelements

    我们将在以后全面支持 .NET 4.0,随之而来的是对动态对象的全面支持。如果你现在真的需要这个功能,你可以在这里看到我使用另一个程序集的并排支持峰值:https://github.com/craiggwilson/mongo-csharp-driver/tree/dynamic。但是,它未经测试,实际上只是一个尖峰,所以要小心。

    【讨论】:

    • 我可以在这里看到你的观点。但我的问题是我的模块输入基本上是一个expando对象,输出也期望expando处理。在这种情况下,即使我最终在 Mongo 中保存了 BSON 文档,我也需要找出从 Mongo 到 BSON 的转换机制,反之亦然.....
    • 如果您一直在使用 Expando,那么您可以创建一个自定义 IBsonSerializer 来处理与 Expando 之间的转换。您可以使用 db.GetCollection("name") 让它们进出。由于 Expando 实现了 IDictionary,因此您可以简单地将您的方法在内部推迟到 DictionaryGenericSerializer。在 master 实际上是一些已经这样做的代码(关于 IDictionary 所以你不需要这个)。到那时……
    • 尝试这样做会给我以下错误:Element '_id' does not match any field or property of class System.Dynamic.ExpandoObject.
    • var expando = db.GetCollection<ExpandoObject>("QueuedMessage"); var message = expando.FindOne(); I tried something like that.
    • 说到你发给我链接的代码。我只需要 DynamicBsonSerializer.cs 吗?可以调用反序列化函数吗?
    【解决方案2】:

    如果您想存储动态/匿名类型,您可以使用自定义 IBsonSerializer。

    请参阅https://stackoverflow.com/a/23244044/327825 获取代码示例

    【讨论】:

      猜你喜欢
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 2021-12-08
      • 2013-08-21
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      相关资源
      最近更新 更多