首页 > 解决方案 > MongoDB C# 驱动程序 (2.7) 和序列化问题

问题描述

我目前对最新的 mongodb c# 驱动程序(2.7)、继承和序列化有一个奇怪的问题。

这是我正在使用的超级简化的类层次结构:

public abstract class BaseClass
{
    public Guid Id { get; private set; }

    protected BaseClass(Guid id)
    {
        Id = id;
    }
}

public class DerivedClass : BaseClass
{
    public DerivedClass(Guid id) : base(id) {}
}

当我尝试为 mongo 序列化注册类时,出现错误:

var type = typeof(DerivedClass);

if (BsonClassMap.IsClassMapRegistered(type))
    return;

var cm = new BsonClassMap(type);
cm.AutoMap();

BsonClassMap.RegisterClassMap(cm);

错误是:

The memberInfo argument must be for class DerivedClass, but was for class BaseClass.
Parameter name: memberInfo

现在,这就是事情开始变得奇怪的地方,当我试图了解发生了什么时,我对 BaseClass 或 DerivedClass 进行了一些更改。

下面列出的两个更改中的任何一个都将使该RegisterClassMap方法正常工作...

更改 1:在 BaseClass 上添加第二个未使用的属性

public abstract class BaseClass
{
    public Guid Id { get; private set; }
    public string Test { get; }

    protected BaseClass(Guid id)
    {
        Id = id;
    }
}

更改 2:将 Id 属性更改为具有非私有设置器(任何其他作品)

public abstract class BaseClass
{
    public Guid Id { get; protected set; }

    protected BaseClass(Guid id)
    {
        Id = id;
    }
}

我的问题是……发生了什么?虽然我可能同意对于序列化程序,您应该为要映射的类(在本例中为 DerivedClass)上的每个属性提供一个可访问的设置器,但为什么案例 #1 实际上没有给出任何错误?

标签: c#mongodbmongodb-.net-driver

解决方案


推荐阅读