c# - 如何使用 JSON.NET 将 POCO 列表序列化为字符串列表,以减小大小?
问题描述
我有一个像这样的简单 POCO:
public class Edit { ... }
public class CharInsert : Edit
{
public int ParagraphIndex { get; set; }
public int CharacterIndex { get; set; }
public char Character { get; set; }
}
像这样在 JSON 中序列化(请注意,由于继承,我正在记录对象类型):
{
"$type": "MyNamespace.CharInsert, MyAssembly",
"paragraphIndex": 7,
"characterIndex": 15,
"character": "e"
}
但这会占用大量空间来存储相当少量的数据。而且我有很多,所以我需要更紧凑。
我做了一个自定义JsonConverter
,以便它将序列化为:
"CharInsert|7|15|e"
当我保留这些列表时,我得到:
[
"CharInsert|7|12|Z",
"CharInsert|7|13|w",
"CharInsert|7|14|i",
"CharInsert|7|15|e",
]
但是当我尝试反序列化这个列表时,我得到了错误:
'将值“CharInsert|7|12|Z”转换为类型“MyNamespace.Edit”时出错
我想这是因为实际对象是 Edit 类型的子类,它不知道是哪一个,因为它不知道如何解析字符串。我该如何实现它,以便它可以解析字符串,解析其中包含的类型名,然后创建所需的对象类型?
解决方案
自定义转换器的另一种方法,考虑使用[JsonProperty(PropertyName = "")]
缩短 json 属性名称,这应该减少空间,您不必担心自定义转换器。
public class CharInsert : Edit
{
[JsonProperty(PropertyName = "p")]
public int ParagraphIndex { get; set; }
[JsonProperty(PropertyName = "i")]
public int CharacterIndex { get; set; }
[JsonProperty(PropertyName = "c")]
public char Character { get; set; }
}
推荐阅读
- kubernetes - 微服务活跃度和就绪超时处理
- python - 带有 scipy.optimize.linprog 的拉格朗日乘数
- java - 如何删除消防基地数据库中的一项?
- flutter - 当用户在 Flutter 中提供错误数据时如何显示错误
- java - Java 是否支持用 Java 编写的输入法?
- python - 安装和导入 tensorflow 和 keras
- gatsby - Netlify CMS 基于主题森林主题构建
- javascript - 如何在反应渲染中使用 calc css 函数
- php - 重定向到控制器结果 404 页面未找到
- python - 缓冲区 dtype 不匹配,预期为 'SIZE_t' 但得到了 'long long'