Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用本文和Json.Net从文件中存储和检索大型Json(100 mb+;)的有效方法_C#_Json_Windows Store Apps_Json.net - Fatal编程技术网

C# 使用本文和Json.Net从文件中存储和检索大型Json(100 mb+;)的有效方法

C# 使用本文和Json.Net从文件中存储和检索大型Json(100 mb+;)的有效方法,c#,json,windows-store-apps,json.net,C#,Json,Windows Store Apps,Json.net,我一直在试图找到使用Json.net从包含Json的文件中存储和检索数据的最佳方法。在我的研究中,我发现了两种方法 Jackson Api(仅适用于Java) 此方法中的任何一种都可以与Json.Net一起使用吗?DrDoobs上是否有本文的实际实现?我无法理解HandleToken(reader.TokenType,reader.Value)方法 当前统计信息: public static T DeserializeJsonFromStream<T>(Stream s)

我一直在试图找到使用Json.net从包含Json的文件中存储和检索数据的最佳方法。在我的研究中,我发现了两种方法

  • Jackson Api(仅适用于Java)
  • 此方法中的任何一种都可以与Json.Net一起使用吗?DrDoobs上是否有本文的实际实现?我无法理解HandleToken(reader.TokenType,reader.Value)方法

    当前统计信息:

    public static T DeserializeJsonFromStream<T>(Stream s)
        {
            using (StreamReader reader = new StreamReader(s))
            {
                using (JsonTextReader jsonReader = new JsonTextReader(reader))
                {
                    JsonSerializer ser = new JsonSerializer();
                    ser.Formatting = Newtonsoft.Json.Formatting.None;
                    ser.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
                    ser.TypeNameHandling = TypeNameHandling.All;
                    ser.NullValueHandling = NullValueHandling.Ignore;
                    ser.Error += ReportJsonErrors;
                    ser.DateFormatHandling = DateFormatHandling.IsoDateFormat;
                    return ser.Deserialize<T>(jsonReader);
                }
            }
        }
        public static void SerializeJsonIntoStream(object value, Stream s)
        {
    
            using (StreamWriter writer = new StreamWriter(s))
            {
                using (JsonTextWriter jsonWriter = new JsonTextWriter(writer))
                {
                    JsonSerializer ser = new JsonSerializer();
    
                    ser.Formatting = Newtonsoft.Json.Formatting.None;
                    ser.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
                    ser.TypeNameHandling = TypeNameHandling.All;
                    ser.NullValueHandling = NullValueHandling.Ignore;
                    ser.Error += ReportJsonErrors;
    
                    ser.Serialize(jsonWriter, value);
                    jsonWriter.Flush();
                }
            }
        }
    
    • 大约5分钟写入大小约为60Mb的Json

    • 大约3分钟阅读Json

    当前代码:

    public static T DeserializeJsonFromStream<T>(Stream s)
        {
            using (StreamReader reader = new StreamReader(s))
            {
                using (JsonTextReader jsonReader = new JsonTextReader(reader))
                {
                    JsonSerializer ser = new JsonSerializer();
                    ser.Formatting = Newtonsoft.Json.Formatting.None;
                    ser.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
                    ser.TypeNameHandling = TypeNameHandling.All;
                    ser.NullValueHandling = NullValueHandling.Ignore;
                    ser.Error += ReportJsonErrors;
                    ser.DateFormatHandling = DateFormatHandling.IsoDateFormat;
                    return ser.Deserialize<T>(jsonReader);
                }
            }
        }
        public static void SerializeJsonIntoStream(object value, Stream s)
        {
    
            using (StreamWriter writer = new StreamWriter(s))
            {
                using (JsonTextWriter jsonWriter = new JsonTextWriter(writer))
                {
                    JsonSerializer ser = new JsonSerializer();
    
                    ser.Formatting = Newtonsoft.Json.Formatting.None;
                    ser.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
                    ser.TypeNameHandling = TypeNameHandling.All;
                    ser.NullValueHandling = NullValueHandling.Ignore;
                    ser.Error += ReportJsonErrors;
    
                    ser.Serialize(jsonWriter, value);
                    jsonWriter.Flush();
                }
            }
        }
    
    public static T反序列化JSONFROMSTREAM(流s)
    {
    使用(StreamReader=新的StreamReader))
    {
    使用(JsonTextReader jsonReader=newjsontextreader(reader))
    {
    JsonSerializer ser=新的JsonSerializer();
    ser.Formatting=Newtonsoft.Json.Formatting.None;
    ser.PreserveReferencesHandling=PreserveReferencesHandling.Objects;
    ser.typenameholling=typenameholling.All;
    ser.NullValueHandling=NullValueHandling.Ignore;
    ser.Error+=报告JSONERRORS;
    ser.DateFormatHandling=DateFormatHandling.IsoDateFormat;
    返回序列反序列化(jsonReader);
    }
    }
    }
    公共静态空序列化JSONINTOStream(对象值,流s)
    {
    使用(StreamWriter=新的StreamWriter))
    {
    使用(JsonTextWriter jsonWriter=newjsontextwriter(writer))
    {
    JsonSerializer ser=新的JsonSerializer();
    ser.Formatting=Newtonsoft.Json.Formatting.None;
    ser.PreserveReferencesHandling=PreserveReferencesHandling.Objects;
    ser.typenameholling=typenameholling.All;
    ser.NullValueHandling=NullValueHandling.Ignore;
    ser.Error+=报告JSONERRORS;
    serial(jsonWriter,value);
    jsonWriter.Flush();
    }
    }
    }
    
    由于我不需要手动读取序列化文件,使用协议缓冲区解决了问题,因此对相同数量的数据进行序列化/反序列化需要6秒钟

    它在Nuget上提供,网址为

    公共静态异步任务反序列化FromBinary(字符串文件名,StorageFolder-StorageFolder)
    {
    尝试
    {
    var file=await-storageFolder.GetFileAsync(文件名);
    如果(文件!=null)
    {
    var stream=await file.OpenStreamForReadAsync();
    T content=Serializer.Deserialize(流);
    返回内容;
    }
    }
    捕获(NullReferenceException nullException)
    {
    logger.LogError(“反序列化输入对象时发生异常,错误:“+nullException.Message”);
    }
    捕获(FileNotFoundException fileNotFound)
    {
    logger.LogError(“反序列化输入对象时发生异常,错误:“+fileNotFound.Message”);
    }
    捕获(例外e)
    {
    LogError(“反序列化输入对象时发生异常,错误:+e.Message,e.ToString());
    }
    返回默认值(T);
    }
    公共静态异步任务序列化为二进制(字符串文件名、StorageFolder destinationFolder、内容)
    {
    bool shouldRetry=true;
    while(应该重试)
    {
    尝试
    {
    StorageFile file=wait destinationFolder.CreateFileAsync(文件名,CreationCollisionOption.ReplaceExisting);
    使用(var stream=await file.OpenStreamForWriteAsync())
    {
    序列化程序。序列化(流、内容);
    shouldRetry=false;
    返回true;
    }
    }
    捕获(unAuthorizedAccess异常unAuthorizedAccess)
    {
    logger.LogError(“序列化输入对象时发生unAuthorizedAccess异常,将等待5秒,错误:“+unAuthorizedAccess.Message”);
    shouldRetry=true;
    }
    捕获(NullReferenceException nullException)
    {
    shouldRetry=false;
    logger.LogError(“序列化输入对象时发生异常,错误:+nullException.Message”);
    }
    捕获(例外e)
    {
    shouldRetry=false;
    LogError(“序列化输入对象时发生异常,错误:+e.Message,e.ToString());
    }
    如果(应该重试)
    等待任务。延迟(5000);
    }
    返回false;
    }
    
    文件可能不是存储和检索大量数据的好地方。也许您应该考虑将数据存储在数据库中。我确实尝试使用Windows Ltore应用程序的SqLLITE,但最终由于SqLITE3.3.DLL中的所有异常而感到沮丧。在我看来,第二个可以用JSON.NET提供的自定义JSON转换器来实现。第二个调用JP.RealValestErthe();这在JsonReader下不可用。目前我确实有,你可以试试这样的东西。