2013-10-09 3 views
0

Класс (Entity)MongoDb C# не удалось сериализовать ответ

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; 
} 

Я строю API с использованием .NET WebAPI и используя mongodb в качестве хранилища данных, у меня возникли проблемы с сериализацией ответного объекта из базы данных.

Не могу понять, почему, поискать в Интернете и найти похожие проблемы без каких-либо решений. Либо я плохой Google поисковик или там ответ скрыт где-то глубоко :)

Полный трассировки стека: http://pastie.org/8389787

+0

Почему не получить доход IEnumerable ? Какое точное исключение? – David

+0

Правильно, что метод Get должен возвращать тип IEnumerable , и это то, что он должен сказать, но проблема не зависит от возвращаемого типа. :) – gonace

+0

Где ошибка? – WiredPrairie

ответ

1

Это немного догадки, но код на самом деле не так уж и говорить.

Я довольно уверен, что это потому, что водитель C# Монго-х BsonDocument предоставляет массу свойств, как AsBoolean, AsInt, AsString и т.д. Вызов этих методов получения на данные, которые не конвертируются в соответствующий тип вызывает исключение. Хотя я не вижу их в трассировке стека, это может быть оптимизация компилятора.

Одним из решений является сделать код строго типизированным (если его еще нет). Я не знаю, что такое UnitOfWork.MemberRepository.GetMembers();, но он скрывает то, что вы делаете, и также неясно, что он возвращает. Вы теряете много преимуществ драйвера C#. Класс Collection<T> в значительной степени похож на шаблон хранилища.

уборщик подход (они не являются взаимоисключающими), чтобы не сериализовать объект базы данных с внешним миром, но и использовать DTO для стороны WebAPI и перевод между ними, например, с помощью AutoMapper. Я всегда буду делать это, потому что вы бросаете объект, который может быть украшен DB-атрибутами в сериализаторе, который вы не знаете, - это может привести к разным проблемам. Кроме того, вы часто хотите скрыть определенную информацию извне или сделать ее доступной только для чтения.

Другой вариант заключается в использовании ServiceStack.Text в качестве JSON-сериализатора, что, как правило, вызывает меньше проблем с моим опытом.

+1

Отличные идеи, я думаю о попытке предложить вам подход AutoMapper. – gonace

Смежные вопросы