我们说我有两个班,即人和项目:
class Person {
public int Id { get; set; }
public string Name { get; set; }
}
class Project {
public int Id { get; set; }
public string Name { get; set; }
public List<Person> Workers { get; set; }
}
我想将人员数据和项目数据存储在名为person.json和project.json的单独文件中。
为了序列化数据我使用下面的语句:
JsonConvert.SerializeObject(Collection, Formatting.None, new JsonSerializerSettings()
{
NullValueHandling = NullValueHandling.Ignore,
TypeNameHandling = TypeNameHandling.All
};)
其中collection是List<People>
。
要反序列化人员数据,请使用以下语句:
JsonConvert.DeserializeObject<List<T>>(json, , new JsonSerializerSettings()
{
NullValueHandling = NullValueHandling.Ignore,
TypeNameHandling = TypeNameHandling.All
};)
其中json是来自person.json的字符串json数据。
我在ListBox中显示List<Person>
。
现在我不确定如何存储项目数据,以便每次编辑人物对象并最终将其保存到person.json文件时,List<Person>
对象中的相应人物对象在项目文件中也更新。
我甚至不确定json是否是一个好的方法,也许我应该尝试关系数据库。
如果我没有很好地解释我的情况,请告诉我。我真的需要用json做这个工作并为我的问题寻找解决方案。任何帮助表示赞赏。
答案 0 :(得分:2)
您的问题并非真正针对序列化,而是针对数据的同步。如果您使用XML,文本文件或某些自定义二进制格式,请考虑一下您会遇到同样的问题。
由于您已将Person
对象反规范化为Project
对象,因此每次保存项目时,它都会拥有所有人员数据的完整副本。
一个选项是 not denormalize,而只是将PersonID
列表放入Project
对象。根据您的应用中哪个路径更突出,您还可以考虑在Person对象中添加ProjectID
列表。换句话说,这种关系可以用任何一种方式表达。
无论如何,您需要管理数据。可能是您编写了一堆代码来从磁盘加载所有JSON文件并自行操作。可能是您将结构化数据映射到可以存储在SQL Server或MySQL等数据库中的关系模式。你可以使用像EntityFramwork或NHibernate这样的ORM来帮助它。或者,您可以使用其中一个NoSQL数据库,如RavenDB或MongoDB,或许多其他类似的项目。
换句话说 - 保持序列化和存储的思想分离。有时序列化涉及存储,但序列化也涉及传输,许多存储引擎以自己的自定义方式处理序列化。