Я создаю сайт ASP.NET (2.0, нет, я не могу его изменить) с помощью NHibernate и имею собственный преобразователь JSON, поэтому я не могу сериализовать свойства, которые хочу скрыть от клиента. Это позволяет мне просто возвращать объекты и никогда не беспокоиться об их сериализованных значениях — они всегда в безопасности.
К сожалению, оказывается, что если я использую query.FutureValue<class>()
, объект, который сериализуется, сначала является NHibernate.Impl.FutureValue<class>
, а не моей сущностью, что означает, что я получаю JSON, который выглядит так, если я бросаю его в словарь и возвращаю это клиенту:
{key: { Value: { /* my serialized object properties */ } }
Ранее я обнаружил, что не могу заставить работать какие-либо интерфейсы в реализациях ASP JavaScriptConverter... только обычные или абстрактные классы. Таким образом, возврат typeof(IFutureValue<MyBaseClass>)
в качестве поддерживаемого типа означает, что мой преобразователь полностью игнорируется. Я могу поймать MyBaseClass, потому что ранее я провел рефакторинг, чтобы использовать абстрактную базу вместо интерфейса, но не сам интерфейс.
А потом я обнаруживаю, что реализация FutureValue в .Impl является внутренней по отношению к сборке, или какая-то другая подобная ерунда, которая только делает мой опыт работы с .NET еще более болезненным. Так что я не могу использовать typeof(FutureValue<MyBaseClass>)
для всего этого, потому что FutureValue существует только в моих сеансах отладки.
Есть ли способ получить тип класса из сборки? Или способ убедить ASP в том, что у интерфейсов действительно есть применение? Или может быть какой-то суперкласс, к которому я могу получить доступ, который позволит мне обойти всю проблему?
Помощь! Мне нравятся мои фьючерсы, они позволяют мне одновременно обрабатывать целую чертову тонну звонков!
(если что-то непонятно или вам нужен код, обязательно спрашивайте! Я могу выложить совсем немного.)
1 ответ
Если я правильно вас понимаю, кажется, вы немного смешиваете вещи вместе.
Похоже, вы пытаетесь сериализовать экземпляр query.FutureValue<class>()
, который, что неудивительно, дает вам именно это: объект JSON, где поля Value
имеют JSON, представляющий вашу сущность.
Мне кажется, что вы действительно хотите просто сериализовать query.FutureValue<class>().Value
.
Использование фьючерсов NHibernate, подобных этому, дает вам небольшую пользу, поэтому вы, вероятно, после чего-то вроде:
var future1 = query1.FutureValue<SomeEntity>();
var future2 = query2.FutureValue<AnotherEntity>();
var json1 = serializer.Serialize(future1.Value); //<BAM! Multi-query gets fired!
var json2 = serializer.Serialize(future2.Value);
Имеет ли это смысл?
Похожие вопросы
Новые вопросы
asp.net
ASP.NET - это среда разработки веб-приложений Microsoft, которая позволяет программистам создавать динамические веб-сайты, веб-приложения и веб-службы. Полезно использовать этот тег в сочетании с тегом типа проекта, например, [asp.net-mvc], [asp.net-webforms] или [asp.net-web-api]. НЕ используйте этот тег для вопросов о ASP.NET Core - используйте вместо этого [asp.net-core].
FutureValue<SomeEntity>()
для ASP, чтобы сериализовать его? Попробуйте вместо этого поставитьFutureValue<SomeEntity>().Value
.typeof(FutureValue<SomeClass>)
. Я возвращаю объекты из WebMethods и перехватываю их с помощью конвертера JSON на выходе. msdn.microsoft.com/en-us/ библиотека/…