Контекст:
Что у меня есть сейчас:
- 3-уровневое приложение
- Client-Server communication
- Server: ASP.NET WebApi v1
- Клиент: HttpClient
- Сериализация — JSON.NET
Однако,
- JSON.NET работает медленно
- JSON.NET еще медленнее при первом вызове (я так понимаю, это из-за генерации сборки сериализатора на лету). Это слишком медленно для меня - в соответствии с требованиями мне нужно максимально оптимизировать первый вызов.
Я рассматриваю возможность использования protobuf-net вместо JSON.NET. В простом приложении PoC он показал более чем в два раза более быстрый результат, даже при первом вызове, особенно когда я предварительно сгенерировал сборку для сериализатора буферов протокола.
Итак, я реализовал MediaTypeFormatter с помощью protobuf-net, и все работает хорошо, кроме одного — сериализации ошибок.
Вот как исключения передаются клиенту:
public class ExceptionShielderAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
context.Response = context.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, context.Exception);
}
}
Внутри метод CreateErrorResponse создает экземпляр HttpError (который наследуется от Dictionary[string, object]) и записывает его в содержимое.
По умолчанию protobuf-net ничего не знает о HttpError, поэтому я попытался добавить HttpError в модель времени выполнения protobuf следующим образом.
typeModel.Add(typeof (HttpError), true);
но это не помогло, когда я звоню
typeModel.Compile("ModelSerializer", "ModelSerializer.dll")
он выдает InvalidOperationException: сериализатор не определен для типа: System.Object. Вероятно, из-за типа Dictionary[string, object], который не поддерживается protobuf-net.
Вопросы:
Есть ли что-нибудь, что я могу сделать для правильной сериализации ошибок, или мне следует избегать использования готовой обработки ошибок и реализовать свою собственную обработку ошибок на сервере, который использует хорошо известные типы, о которых знает protobuf?
Является ли protobuf хорошим выбором для моей проблемы?