Pertanyaan Mendapatkan OutOfMemoryException saat serialisasi ke JSON?


Saya serialisasi, a MultiDictionary<String,Object>

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

Ini memiliki 618 elemen dengan elemen yang sangat bersarang, yaitu. Objek tunggal mungkin memiliki beberapa kamus seperti objek di dalamnya. Saya menggunakan JSON.Net

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

apa yang saya lewatkan?

INFO LEBIH LANJUT: - Ini berfungsi dengan baik sampai saya menggunakan dinamis, saya harus beralih ke MultiDictionary untuk memungkinkan beberapa properti dengan nama yang sama. Ia bekerja untuk sebagian besar kasus, hanya ketika jumlah item besar, rusak.

PERBARUI: -

Saya telah mampu menguasai konsumsi Memory tetapi mengurangi beberapa elemen yang ditambahkan secara rekursif ke setiap elemen.


9
2017-12-25 17:50


asal


Jawaban:


Tampaknya Anda berlari ke dalam Referensi Ciruclar yang menyebabkan OutOfMemoryException atau benda-benda Anda terlalu besar untuk ingatan Anda. Menggunakan NDepend untuk memeriksa ini.

Anda mungkin menemukan berguna mendapatkan ukuran total objek Anda.


12
2017-12-25 17:58



Dengan asumsi Anda tidak memiliki Referensi Edaran - jika Anda tidak dapat menyimpan semuanya dalam memori, gunakan StreamWriter (JsonWriter atau TextWriter) di Newtonsoft v4.0.30319

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

Gunakan JsonWriter jika Anda mencoba meneruskan string

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

using(JsonWriter writer = new JsonTextWriter(sw))
{
  var serializer = new JsonSerializer();
  serializer.Serialize(writer, myObject);
}

6
2017-08-16 20:21



Sulit untuk mengatakan tanpa mengetahui struktur yang tepat dari objek yang diserialkan, tetapi mungkin saja, karena grafik objek sangat besar, mungkin ada referensi melingkar di suatu tempat (sebuah objek yang menunjuk ke objek yang pada gilirannya menunjuk ke objek pertama ), menciptakan loop serialisasi tak terbatas.

EDIT:

Anda dapat menggunakan alat, seperti NDepend, untuk mencari tahu di mana referensi melingkar berada. Berikan percobaan versi percobaan.


2
2017-12-25 18:00