【问题标题】:JSON.NET serialize and deserialize fragmentsJSON.NET 序列化和反序列化片段
【发布时间】:2011-06-04 06:06:59
【问题描述】:

我有对象队列,我不断刷新到文件以进行脱机处理。每个对象类型都有自己的文件,我想使用 JSON.NET 来序列化对象。

假设我有一个Queue<LogInfo>,每次刷新它时,它都会转到同一个文件。我一次序列化每个对象,并将它们附加到字符串生成器,用逗号分隔。所以我的文件看起来像。

{ "Id":1,"Name":"a"},
{ "Id":2,"Name":"b"},

现在当我想处理这些时,我在文件中读取,但在所有文本前面加上一个“[”,最后我附加一个“]”,以便 JSON.NET 可以将片段反序列化为列表LogInfo 对象。

我意识到这可能不是 JSON 序列化程序的预期用途,但有更好的方法吗?有没有办法我可以一个接一个地读取片段(序列化对象)而不必破解[]?,或者告诉序列化程序我给它一个逗号-分离的一系列对象?

【问题讨论】:

  • 数据库队列不是一个选项吗?
  • 不,它必须是一个文件——数据库太简单了:)

标签: c# json.net


【解决方案1】:

你做错了。只需将它们放在一个列表中并使用 Json.NET 对其进行序列化。每行一个对象不是有效的 JSON 文档,如果如您所说,您只需要一个列表。那你为什么不把它列个清单呢?

【讨论】:

  • 因为我没有预先的完整列表,一次只有一部分。
  • 但是您仍然可以构建需要序列化的项目列表,并且您不应该害怕构建新列表(即使是子集),这是完全有效的事情。现在您可能会更加保守一些内存,但在托管世界中,短期分配是免费的。
  • 但是我不会有同样的问题吗?它会反序列化为 List>,但我必须用逗号分隔每个序列化列表,并在文件的开头和结尾放置一个 [ 和 ],对吗?
  • 我不明白你为什么会有这个,你有一个队列,它实际上已经是一个列表,只需执行.ToList() 和序列化就可以了。导致List<LogInfo>。但是,如果您要附加到磁盘上的文件,JSON 并不能真正提供帮助,它是一种文档格式(它总是有开始和结束)。如果是这种情况,您也应该考虑将每个文档拆分为自己的文件。
【解决方案2】:

我宁愿鼓励使用更适合此的序列化程序,例如由我们自己的Marc Gravell 创建的protobuf-net,而不是试图强制 JSON.NET 提交。 Protobuf 将允许您将数据流式传输到文件中并非常轻松地将其流式传输回来。

您只需声明您期待一个列表而不是要求反序列化器识别已提供的列表。附带的好处是,由于协议缓冲区的积极压缩,您生成的文件会更小。

【讨论】:

  • 协议缓冲区在设计和元数据方面与 Json.NET 根本不同。如果对问题有更好的理解,我会使用协议缓冲区,否则不会,仅将 Json.NET 换成协议缓冲区就太不同了。
  • 听起来很酷,但我不想用序列化属性来装饰我的所有类
猜你喜欢
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
相关资源
最近更新 更多