Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用原型对象进行序列化/反序列化_C#_Json.net - Fatal编程技术网

C# 使用原型对象进行序列化/反序列化

C# 使用原型对象进行序列化/反序列化,c#,json.net,C#,Json.net,基本上我遇到了问题,我不知道下一步该怎么办。也许我只是把我的解决方案弄得太复杂了,还有一个更简单,或者我就是看不到答案。我正在开发一个系统,其中每个对象都有自己的原型父对象。Prototype对象具有对象所需的所有信息。在序列化过程中,我只在prototype对象中存储与相同属性不同的属性。我这样做可以减少序列化对象文件的大小。这似乎很好,但它带来了一个新问题 这里有一个例子:假设我有一个敌人角色对象。它有名称、运行状况、库存值等。在游戏保存过程中,我序列化了所有这些值,不包括未更改且与原型对象

基本上我遇到了问题,我不知道下一步该怎么办。也许我只是把我的解决方案弄得太复杂了,还有一个更简单,或者我就是看不到答案。我正在开发一个系统,其中每个对象都有自己的原型父对象。Prototype对象具有对象所需的所有信息。在序列化过程中,我只在prototype对象中存储与相同属性不同的属性。我这样做可以减少序列化对象文件的大小。这似乎很好,但它带来了一个新问题

这里有一个例子:假设我有一个敌人角色对象。它有名称、运行状况、库存值等。在游戏保存过程中,我序列化了所有这些值,不包括未更改且与原型对象中相同的值。这一部分很简单,但我不明白的是如何解决我的反序列化过程

当我重新加载游戏时,我想从保存文件中反序列化对象,然后-如果存在原型对象,我想用原型对象数据填充反序列化对象。我在本例中看到的问题是,如果角色的库存包含与原型不同的项目,它仍然会从原始blueprint对象接收这些项目


如果某些值已经存在,我想跳过这些值,我如何能够自动执行这些情况?例如,如果健康值已经存在-我不想要原型中的原始值。或者,如果库存中已经有物品-我不想从blueprint对象接收物品。

您可以这样做:

JObject o1 = JObject.Parse(@"{
  'FirstName': 'John',
  'LastName': 'Smith',
  'Enabled': false,
  'Roles': [ 'User' ]
}");
JObject o2 = JObject.Parse(@"{
  'Enabled': true,
  'Roles': [ 'User', 'Admin' ]
}");

o1.Merge(o2, new JsonMergeSettings
{
    // union array values together to avoid duplicates
    MergeArrayHandling = MergeArrayHandling.Union
});

string json = o1.ToString();
// {
//   "FirstName": "John",
//   "LastName": "Smith",
//   "Enabled": true,
//   "Roles": [
//     "User",
//     "Admin"
//   ]
// }

复制自:

什么是原型对象?您是指具有默认值的对象吗?是的,具有默认值的对象。谢谢!我会调查一下,如果对我来说有效的话,我会回答的。保罗,有效的。再次谢谢你。如果可以做一些像这样简单的事情,通过比较o2和原始o1,从o2对象中提取精确的变化,有什么想法吗?这个答案可能很有用:谢谢。它应该能起作用。