2011-12-25 2 views
9

Я сериализации, MultiDictionary<String,Object>Получение исключения OutOfMemoryException при сериализации в JSON?

http://powercollections.codeplex.com/ to json .

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

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

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

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

UPDATE: -

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

ответ

12

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

Возможно, вы найдете полезную информацию getting the total size of your objects.

+0

Есть ли способ проверить циркулярную ссылку? –

+0

NDepend, см. Мой отредактированный ответ –

+1

@ashutoshraina http://www.ndepend.com/Features.aspx#DependencyCycle кажется предпочтительным инструментом для всех –

2

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

EDIT:

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

4

Предполагая, что вы не имеете циклические ссылки - если вы не можете хранить все это в памяти использовать 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); 
} 
+0

Большое спасибо. После такой большой головной боли, наконец, ваши первые решения в отношении TextWriter будут работать. Я желаю, если бы я мог проголосовать за вас 10 раз. – Dilip0165

Смежные вопросы