相关疑难解决方法(0)

我可以使用流解压缩和反序列化文件吗?

我的应用程序使用Json.Net序列化对象,压缩生成的JSON,然后将其保存到文件中.此外,应用程序可以从其中一个文件加载对象.由于现有代码创建大字符串和字节数组的方式,这些对象的大小可能是几十Mb,我担心内存使用情况: -

public void Save(MyClass myObject, string filename)
{
    var json = JsonConvert.SerializeObject(myObject);
    var bytes = Compress(json);
    File.WriteAllBytes(filename, bytes);
}

public MyClass Load(string filename)
{    
    var bytes = File.ReadAllBytes(filename);
    var json = Decompress(bytes);
    var myObject = JsonConvert.DeserializeObject<MyClass>(json);
}

private static byte[] Compress(string s)
{
    var bytes = Encoding.Unicode.GetBytes(s);

    using (var ms = new MemoryStream())
    {
        using (var gs = new GZipStream(ms, CompressionMode.Compress))
        {
            gs.Write(bytes, 0, bytes.Length);
            gs.Close();
            return ms.ToArray();
        }
    }
}

private static string Decompress(byte[] bytes)
{
    using (var …
Run Code Online (Sandbox Code Playgroud)

c# stream json.net gzipstream

6
推荐指数
1
解决办法
2204
查看次数

如何强制为 null 值调用 JsonConverter.WriteJson()

我想用一些元数据将一些属性包装在 JSON 对象中,无论它是否为空。但是,JsonConverter.WriteJson如果属性为 ,则不会调用我的自定义覆盖null

当属性不为空时我得到什么:

{"Prop":{"Version":1, "Object":{"Content":"abc"}}}
Run Code Online (Sandbox Code Playgroud)

当它为空时我得到什么:

{"Prop":null}
Run Code Online (Sandbox Code Playgroud)

当它为空时我想要什么:

{"Prop":{"Version":1, "Object":null}}
Run Code Online (Sandbox Code Playgroud)

由于WriteJson从未被要求提供空值,我没有机会控制这种行为。有什么办法可以强制这样做吗?

请注意,我想知道这是否可以与转换器或合约解析器等一起使用,我不能/不想更改MyContentWrap类(见下文)。

class VersioningJsonConverter : JsonConverter
{
    //Does not get called if value is null !!
    public override void WriteJson(JsonWriter writer, Object value, JsonSerializer serializer)
    {
        writer.WriteStartObject();
        writer.WritePropertyName("v");
        writer.WriteValue(1);
        writer.WritePropertyName("o");
        if(value == null)
        {
            //never happens
            writer.WriteNull();
        }
        else
        {
            writer.WriteStartObject();
            writer.WritePropertyName("Content");
            writer.WriteValue((value as MyContent).Content);                
            writer.WriteEndObject();
        }
        writer.WriteEndObject();
    }
    public override Object ReadJson(JsonReader reader, Type objectType, …
Run Code Online (Sandbox Code Playgroud)

c# json.net

5
推荐指数
1
解决办法
4394
查看次数

标签 统计

c# ×2

json.net ×2

gzipstream ×1

stream ×1