Пользовательские сериализация и десериализация JSON.net

1

Я записываю данные в формат JSON, которые будут использоваться другой программой. Мне нужно сериализовать большое количество объектов JSON в файл. Используя 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 (example class) и хочу их сериализовать (по мере их получения).

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

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. Смотрите этот пост в блоге Джеймса Ньютона-Кинга. james.newtonking.com/archive/2009/02/14/...
  • 0
    Brilliant! Это было действительно полезно!
Теги:
serialization
json.net

1 ответ

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("]");
                }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню