【问题标题】:Multiple objects serialization多对象序列化
【发布时间】:2021-12-31 19:40:29
【问题描述】:

我正在制作一个需要序列化多个对象的 ToDoList-Console 应用程序。 有 2 个任务类:

  • 简单的任务
  • 复杂的任务

我需要一种方法来序列化和期望这些任务,例如WriteAndReadComplexTask,这两个类不会重写整个tasks.json 文件,而是将其加起来。这就是我的最终目标:

[
 {
    "SimpleTask": "do the dishes"
 }
 {
    "ComplexTask": "buy groceries"
      { "subtask": "bananas",
        "subtask": "apples"}
 }
 {
    "simple task": "do some coding"
 }
]

【问题讨论】:

  • 这不是有效的 JSON。每个属性名称以及每个文本值都应该用双引号括起来。
  • 感谢 @jason.kaisersmith,我是 json 新手,所以我不知道
  • 坦率地说,如果您决定使用文本文件来存储数据,那么是的,您可以编写代码来处理部分重写,但这将是 非常困难。如果您需要能够对存储进行随机访问更新,请不要使用 JSON 或其他文本文件格式,请使用 sqlite 之类的数据库。
  • 你需要使用基于文本的序列化吗?我知道 protobuf .net 可以使用 SerializeWithLengthPrefix 将任意数量的消息附加到流中。
  • 我不需要,但因为我是初学者,我不明白你说的任何东西,我认为我应该坚持更简单的东西。对不起@JonasH

标签: c# json serialization


【解决方案1】:

这并不难做到。但是我认为您是从不同的角度解决问题,我建议您尝试仅使用 1 个已包含所有字段的类并使用 1 个 todoitem 任务来解决此问题。这样可以节省时间和复杂的逻辑,否则您将来可能需要将项目从简单任务转换为复杂任务。

  1. 首先,您的 JSON 仍然不正确。每个对象后都缺少逗号。

  2. 我建议将您的 JSON 更改为以下内容:

[
     {
        "name": "SimpleTask"
        "description": "do the dishes"
     },
     {
        "name": "Simple task",
        "description": "buy groceries",
         "subtasks":[ 
             {"name": "Simple task",
        "description": "buy groceries"},{.... repeat another item}]
     },
     {
         ..another item here 
     }
]
  1. 创建一个类似于 JSON 中的对象的新类,如下所示:
public class TodoItem 
{
    public string name {get;set;}
    public string description {get;set;}
    public List<TodoItem> subtasks {get;set;}
}
  1. 现在在您的代码中加载文件并使用以下内容加载到 C#
var todoitems = JsonSerializer.Deserialize<List<TodoItem>>(jsonString);

【讨论】:

  • 好吧,经过多次试验和错误,我得到了它的工作,有点。我是初学者,如果我错了,请纠正我,但我认为ToDoItem 类需要Public Override string ToString(),所以当我反序列化它们时,我可以打印出字符串。另外,您将如何处理子任务列表?我有麻烦打印出来。我尝试将Strin.Join 直接实现到ToString() 的r​​eturn 语句中。它设法对其进行序列化和反序列化,但无法使用foreach 循环打印它
  • @Rarowcun 您不需要覆盖,但这是一种做事方式,没问题。您还可以创建一个允许 ToDoItem 并在函数内打印的新函数。例如,您可以使用Console.Writeline($"name: {ToDoItem.name} description: {ToDoItem.description}") 打印它,现在您可以添加foreach(var subtask in ToDoItem.subtasks) { ToDoItem.ToString() }
猜你喜欢
  • 2015-10-08
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 2013-12-04
  • 2011-06-25
  • 1970-01-01
相关资源
最近更新 更多