2014-09-02 3 views
1

Я записываю данные в формат JSON, которые будут использоваться другой программой. Мне нужно сериализовать большое количество объектов JSON в файл. Использование Json.NET это действительно прямо вперед сериализовать следующие строки кода:Пользовательская сериализация и десериализация JSON.net

[JsonConverter(typeof(SimpleClassSerializer))] 
public class SimpleClass 
{ 
    public string name; 
} 

SimpleClass obj1 = new SimpleClass { name="exampleObj1" }; 
string serialised = JsonConvert.SerializeObject(obj1, Formatting.Indented); 

Давая выход:

{ 
    "name": "exampleObj1" 
} 

Я на самом деле будет работать с несколькими SimpleClass (например, класс) объектов и хотите их сериализовать (как я их получаю).

Используя следующий пример кода, это красиво и просто, если у меня есть массив или список:

SimpleClass[] arr1 = new SimpleClass[3]; 

SimpleClass obj1 = new SimpleClass { name="exampleObj1" }; 
SimpleClass obj2 = new SimpleClass { name = "exampleObj2" }; 
SimpleClass obj3 = new SimpleClass { name = "exampleObj3" }; 

arr1[0] = obj1; 
arr1[1] = obj2; 
arr1[2] = obj3; 

string serialised = JsonConvert.SerializeObject(arr1, Formatting.Indented); 

дает мне следующий вывод:

[ 
    { 
    "name": "exampleObj1" 
    }, 
    { 
    "name": "exampleObj2" 
    }, 
    { 
    "name": "exampleObj3" 
    } 
] 

Это легко десериализованное в массив ,

Однако я не могу объявить массив вперед (например, string [] arr = new string [50000]), потому что я не знаю числа объектов, с которыми я имею дело, и из-за ограничений памяти (данные в каждом объекте огромный). Я не могу использовать список в основном из-за ограничений памяти.

Если я сделать следующее:

SimpleClass obj1 = new SimpleClass { name="exampleObj1" }; 
SimpleClass obj2 = new SimpleClass { name = "exampleObj2" }; 
SimpleClass obj3 = new SimpleClass { name = "exampleObj3" }; 

string serialised = JsonConvert.SerializeObject(obj1, Formatting.Indented); 
serialised += JsonConvert.SerializeObject(obj2, Formatting.Indented); 
serialised += JsonConvert.SerializeObject(obj3, Formatting.Indented); 

Давая мне это:

{ 
    "name": "exampleObj1" 
}{ 
    "name": "exampleObj2" 
}{ 
    "name": "exampleObj3" 
} 

Главное здесь в том, что у меня есть открытый файл, и я потокового сериализованные объекты в файл как Я их получаю. Дайте мне этот формат, показанный выше. При попытке десериализовать такой объект я получаю сообщение об ошибке, поскольку он в основном ожидает, что он будет массивом.

Каков наилучший подход к непрерывной сериализации таким образом?

В идеале, если бы я мог выполнить некоторую сериализацию, когда начинаю писать «[» в файл в начале и «]» в конце (и между запятыми между каждым объектом!), То потребительское приложение может десериализоваться в массив. Как мне это сделать?

+1

Json.net имеет JsonWriter и JsonSerializer. Смотрите это сообщение Джеймс Ньютон-Кинг. http://james.newtonking.com/archive/2009/02/14/writing-json-to-a-file-using-json-net – cgotberg

+0

Блестящий! Это было действительно полезно! –

ответ

2

на основе информации, предоставленной мне cgotberg (жаль не кажется, чтобы быть в состоянии пометить комментарий как ответ: -s)

Здесь было решение:

using (FileStream fs = File.Open(@"c:\temp\a.json", FileMode.Create)) 
    using (StreamWriter sw = new StreamWriter(fs)) 
      using (JsonWriter jw = new JsonTextWriter(sw)) 
       { 
        jw.Formatting = Formatting.Indented; 

        JsonSerializer serializer = new JsonSerializer(); 
        sw.Write("["); 
        serializer.Serialize(jw, obj1); 
        sw.Write(","); 
        serializer.Serialize(jw, obj2); 
        sw.Write(","); 
        serializer.Serialize(jw, obj3); 
        sw.Write("]"); 
       } 
Смежные вопросы