Я создаю сайт 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 в том, что у интерфейсов действительно есть применение? Или может быть какой-то суперкласс, к которому я могу получить доступ, который позволит мне обойти всю проблему?

Помощь! Мне нравятся мои фьючерсы, они позволяют мне одновременно обрабатывать целую чертову тонну звонков!

(если что-то непонятно или вам нужен код, обязательно спрашивайте! Я могу выложить совсем немного.)

0
Groxx 16 Мар 2011 в 23:06

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

Имеет ли это смысл?

0
mookid8000 17 Мар 2011 в 01:59
На самом деле, ASP сериализует для меня FutureValuees, передавая .Value моему коду сериализации, и я хочу захватить его дальше вверх по течению. Но FutureValue — это внутренний класс в NHibernate, поэтому я не могу приводить к нему и не могу регистрировать интерфейсы в сериализаторе (по пока непонятным мне причинам). Поэтому я надеюсь, что кто-нибудь может сказать мне, как получить доступ к этому внутреннему типу класса, чтобы я мог захватить эти типы, вместо того, чтобы всегда опаздывать на один уровень.
 – 
Groxx
17 Мар 2011 в 02:11
Хорошо, но куда вы поместите FutureValue<SomeEntity>() для ASP, чтобы сериализовать его? Попробуйте вместо этого поставить FutureValue<SomeEntity>().Value.
 – 
mookid8000
17 Мар 2011 в 09:08
Класс преобразователя JSON определяет перечисление «поддерживаемые типы». Поэтому я должен вернуть такие вещи, как typeof(FutureValue<SomeClass>). Я возвращаю объекты из WebMethods и перехватываю их с помощью конвертера JSON на выходе. msdn.microsoft.com/en-us/ библиотека/…
 – 
Groxx
17 Мар 2011 в 18:55