为什么MongoDB.Bson.Serialization.BsonClassMapSerializer.DeserializeExtraElement抛出空引用异常

时间:2015-04-03 17:51:45

标签: c# mongodb serialization

我们的一份文件中的Bson元素名称已更改。我试图通过将旧元素名称序列化到我们实体的ExtraElements属性中来使向后兼容更改,以便我可以将其映射到新属性。我在这里遵循了一个实现示例http://docs.mongodb.org/ecosystem/tutorial/serialize-documents-with-the-csharp-driver/#a-member-is-renamed,但无济于事。我已经尝试过显式注册地图类。我将ExtraElements类型更改为BsonDocument而不是IDictionary。我尝试过私有支持者,静态构造函数等。出于某种原因,当调用MongoDB.Bson.Serialization.BsonClassMapSerializer.DeserializeExtraElement并且我不明白为什么时,我一直得到一个空引用异常。

这是电话

var cacheEvent = BsonSerializer.Deserialize<CacheEventDocument>(cacheEventDocument);

应该注意,CacheEventDocument类确实派生自基类。但是,我尝试使用BsonClassMap.RegisterClassMap注册该类,并且我还使用BsonKnownTypes属性修饰了基类。没有什么能够解决这个空引用异常。

static CacheEventDocument()
    {
        BsonClassMap.RegisterClassMap<CacheEventDocument>(cm =>
            {
                cm.AutoMap();
                cm.SetExtraElementsMember(cm.GetMemberMap(c => c.ExtraElements));
            });
    }

我知道,我需要验证该类是否已经注册。我还没有为此烦恼。我只是想让反序列化工作,以便我可以将旧字段映射到新字段。

public void EndInit()
    {
        object coaterSiteName;

        if (!this.ExtraElements.TryGetValue("RoutingSiteName", out coaterSiteName)) { return; }

        this.CoaterSiteName = (string)coaterSiteName;

        // remove the Name element so that it doesn't get persisted back to the database
        this.ExtraElements.Remove("RoutingSiteName");
    }

public BsonDocument ExtraElements { get; set; }

我还需要做些什么吗?

0 个答案:

没有答案