MongoDb C#无法序列化响应

时间:2013-10-09 15:40:29

标签: c# asp.net-mvc mongodb

类(实体)

public class Entity
{
    public ObjectId Id { get; set; }

    public Entity()
    {
        Id = ObjectId.GenerateNewId();
    }
}

班级(会员)

public class Member : Entity
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string MobileNumber { get; set; }
}

动作

public dynamic Get()
{
    var response = UnitOfWork.MemberRepository.GetMembers();

    return response;
}

我正在使用.NET WebAPI构建API并使用mongodb作为数据存储区,我在从数据库中序列化响应对象时遇到了一些麻烦。

无法理解为什么,在互联网上搜索一段时间,发现没有解决方案的类似问题。要么我是一个糟糕的谷歌搜索者,要么答案隐藏在深处:)

完整堆栈跟踪:http://pastie.org/8389787

1 个答案:

答案 0 :(得分:1)

这是一个小小的猜测,但代码真的不太讲究。

我很确定这是因为C#Mongo驱动程序的BsonDocument暴露了大量属性,例如AsBooleanAsIntAsString等。调用这些getter on不可转换为相应类型的数据会导致异常。虽然我没有在堆栈跟踪中看到它们,但这可能是编译器优化。

一种解决方案是使代码强类型化(如果它还没有)。我不知道UnitOfWork.MemberRepository.GetMembers();是什么,但它隐藏了你正在做的事情,而且还不清楚它返回的是什么。你失去了C#驱动程序的许多优点。顺便说一下,Collection<T>类几乎就是一个存储库模式。

更简洁的方法(它们不是互斥的)是不将数据库对象序列化到外部世界,而是将 DTO 用于WebAPI端并在它们之间进行转换,例如使用AutoMapper。我会一直这样做,因为你在一个你不知道的序列化器中抛出一个可能用DB-Attributes装饰的对象 - 这可能会导致各种各样的问题。此外,您经常希望从外部隐藏某些信息,或将其设置为只读。

另一种选择是使用ServiceStack.Text作为JSON序列化器,这样可以减少我的经验。