我正在将数据写入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(示例类)对象,并希望将它们全部序列化(因为我收到它们)。
使用以下示例代码,如果我有一个数组或列表,这很简单:
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"
}
这里的主要内容是我有一个打开的文件,当我收到它时,我将序列化的对象流式传输到文件中。给我上面显示的这种格式。当试图反序列化这样的对象时,我得到一个错误,因为它基本上是期望它是一个数组。
以这种方式实现连续序列化的最佳方法是什么?
理想情况下,如果我可以做一些自定义序列化,我开始编写" ["在开头的文件和"]"在最后(以及每个对象之间的逗号!),然后消费应用程序可以反序列化为一个数组。我该怎么做?
答案 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("]");
}