C# 自定义JSON.net序列化和反序列化

C# 自定义JSON.net序列化和反序列化,c#,.net,json,serialization,json.net,C#,.net,Json,Serialization,Json.net,我将数据写入JSON格式,供另一个程序使用。我需要将大量JSON对象序列化到一个文件中。使用JSON.net,使用以下代码行进行序列化非常简单: [JsonConverter(typeof(SimpleClassSerializer))] public class SimpleClass { public string name; } SimpleClass obj1 = new SimpleClass { name="exampleObj1" }; string serialised

我将数据写入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"
}
这里的主要问题是,我有一个打开的文件,当我接收到序列化对象时,我将它们流式传输到文件中。给我上面显示的格式。当试图反序列化这样一个对象时,我得到一个错误,因为它基本上希望它是一个数组

以这种方式实现连续序列化的最佳方法是什么


理想情况下,如果我可以进行一些自定义序列化,在开始时将“[”写入文件,在结束时将“]”(以及每个对象之间的逗号!),那么消费应用程序可以反序列化为一个数组。如何做到这一点?

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

Json.net有一个JsonWriter和JsonSerializer。请看这篇詹姆斯·牛顿·金的博客文章。明亮的那真的很有帮助!