从MongoDb + C#反序列化没有默认构造函数的对象#

时间:2013-10-26 15:59:23

标签: c# mongodb mongodb-.net-driver bson

考虑两个类:

public class Entity
{
    public ObjectId Id { get; set; }
    public E2 e = new E2(ConfigClass.SomeStaticMethod());
}

public class E2
{
    [BsonIgnore]
    public int counter = 5;
    public DateTime last_update { get; set; }

    public E2(int c)
    {
        counter = c;
    }
}

我将存储然后从类似的MongoDb中检索类型为Entity的对象(假设集合为空):

var collection = database.GetCollection<Entity>("temp");
collection.Save<Entity>(new Entity());
var list = collection.FindAs<Entity>(new QueryDocument());
var ent = list.Single();

无论ConfigClass.SomeStaticMethod()返回什么,counter字段都将为零(整数的默认值)。但是,如果我向E2类添加默认构造函数,则counter将为5

这意味着MongoDb的C#驱动程序在调用非默认构造函数时遇到了问题(完全可以理解)。我知道在BSON库中定义了BsonDefaultValue属性,但它只能接受constant expressions

我要做的是从配置文件中加载字段的默认值,同时从MongoDb中检索其余的对象!?当然,努力最少。

[UPDATE]

我也用相同的结果对此进行了测试:

public class Entity
{
    public ObjectId Id { get; set; }
    public E2 e = new E2();
    public Entity()
    {
        e.counter = ConfigClass.SomeStaticMethod();
    }
}

public class E2
{
    [BsonIgnore]
    public int counter = 5;
    public DateTime last_update { get; set; }
}

运行此代码会导致counter再次为零!

1 个答案:

答案 0 :(得分:4)

我设法完成了这样的事情:

public class Entity
{
    public ObjectId Id { get; set; }
    public E2 e = new E2();
}

public class E2 : ISupportInitialize
{
    [BsonIgnore]
    public int counter = 5;
    public DateTime last_update { get; set; }

    public void BeginInit()
    {
    }

    public void EndInit()
    {
        counter = ConfigClass.SomeStaticMethod();
    }
}

ISupportInitialize接口带有两个BeginInitEndInit方法,它们在反序列化过程之前和之后调用。它们是设置默认值的最佳位置。