2014-09-18 3 views
3

Все,Newtonsoft Json - OutOfMemoryException

Окружающая среда: ASP.net 2,0, 3,3 Nhibernate, Json.net (последнее, 6.x)

Я использую последнюю версию библиотеки Newtonsoft.Json. Когда я загружаю объект, использующий nhibernate (мои объекты ссылаются на другие объекты и загружаются лениво), я получаю исключение из памяти или исключение stackoverflow.

Код для OutOfMemory исключения:

JsonSerializerSettings settings = new JsonSerializerSettings(); 
    settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 
    settings.PreserveReferencesHandling = PreserveReferencesHandling.Objects; 
    string json = JsonConvert.SerializeObject(container.DataItem, settings); 

Код для StackOverflow исключения:

JsonSerializerSettings settings = new JsonSerializerSettings(); 
    settings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; 
    settings.PreserveReferencesHandling = PreserveReferencesHandling.Objects; 
    string json = JsonConvert.SerializeObject(container.DataItem, settings); 

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

+0

Вы уверены, что ваш объект график небольшой? Вы уверены, что он не постоянно перетекает из одной ленивой коллекции в другую, постепенно загружая всю базу данных? –

+0

Я собираюсь подтвердить это на следующей неделе, но, недолго глядя на него, я не видел проблемы. – ActiveX

+0

Я просто проверил свой объектный граф, это не сам объект, а возвращаемый прокси-сервер (см. Ответ ниже). – ActiveX

ответ

3

вы используете отложенную загрузку так NHibernate руки назад прокси здесь и там, и эти прокси имеют ссылки на System.Type объект, который будет иметь бесконечные циклы, а также ссылку на сессию и SessionFactory, который будет тяжелым по себе, проверить NHibernate.Proxy.INHibernateProxy ,

Так как:

  • нетерпеливые нагрузки вещи сериализовать или
  • указать, какие свойства непосредственно сериализовать или
  • не сериализовать объекты ALLtogether
+0

Спасибо за отличный ответ. Я никогда не смотрел подробно прокси-класс, но это имеет смысл сейчас. – ActiveX