Получение исключения OutOfMemoryException при сериализации в JSON?

Я сериализую, MultiDictionary<String,Object>

http://powercollections.codeplex.com/

Он имеет 618 элементов, причем элементы глубоко вложены, т. Е. один объект может иметь в себе несколько объектов, подобных словарю. Я использую JSON.Net

String json = JsonConvert.SerializeObject(json, Newtonsoft.Json.Formatting.Indented);

что мне не хватает?

БОЛЬШЕ ИНФОРМАЦИИ: - Это работало нормально, пока я не использовал динамический, мне пришлось переключиться на MultiDictionary, чтобы разрешить несколько свойств с одним и тем же именем. Работает в большинстве случаев, только при большом количестве пунктов ломается.

ОБНОВИТЬ: -

Я смог удержать потребление памяти, но сократил некоторые элементы, которые рекурсивно добавлялись к каждому элементу.


person ashutosh raina    schedule 25.12.2011    source источник


Ответы (3)


Похоже, вы сталкиваетесь с Ciruclar Reference, которая вызывает OutOfMemoryException или ваши объекты просто слишком большой для вашей памяти. Используйте NDepend, чтобы проверить это.

Возможно, вам будет полезно получить общий размер ваших объектов.

person Tomislav Markovski    schedule 25.12.2011
comment
есть ли способ проверить циркулярную ссылку? - person ashutosh raina; 25.12.2011
comment
@ashutoshraina ndepend.com/Features.aspx#DependencyCycle кажется всем предпочтительным инструментом - person Tomislav Markovski; 25.12.2011

Предполагая, что у вас нет круговых ссылок - если вы не можете сохранить все это в памяти, используйте StreamWriter (JsonWriter или TextWriter) в Newtonsoft v4.0.30319

using (TextWriter writer = File.CreateText("LocalJSONFile.JSON"))
{
    var serializer = new JsonSerializer();
    serializer.Serialize(writer, myObject);
}

Используйте JsonWriter, если вы пытаетесь передать строку

StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);

using(JsonWriter writer = new JsonTextWriter(sw))
{
  var serializer = new JsonSerializer();
  serializer.Serialize(writer, myObject);
}
person Sam    schedule 16.08.2016
comment
Большое спасибо. После такой большой головной боли, наконец, ваши первые решения относительно TextWriter приняты. Желаю, если бы я мог проголосовать за вас 10 раз. - person Dilip0165; 20.10.2016
comment
Как пройти настройки? например PreserveReferencesHandling = PreserveReferencesHandling.Objects, ReferenceLoopHandling = ReferenceLoopHandling.Serialize - person Gopu_Tunas; 30.01.2020
comment
Также без настроек приведенный выше код не работает, хотя на моем компьютере доступно 4 ГБ ОЗУ. - person Gopu_Tunas; 30.01.2020

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

РЕДАКТИРОВАТЬ:

Вы можете использовать инструмент, например NDepend, чтобы узнать, где находятся циклические ссылки. Попробуйте пробную версию.

person Óscar López    schedule 25.12.2011