我的应用程序使用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) 我想用一些元数据将一些属性包装在 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从未被要求提供空值,我没有机会控制这种行为。有什么办法可以强制这样做吗?
请注意,我想知道这是否可以与转换器或合约解析器等一起使用,我不能/不想更改MyContent或Wrap类(见下文)。
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)