原型对象的序列化/反序列化

本文关键字:反序列化 序列化 对象 原型 | 更新日期: 2024-09-20 13:33:34

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

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

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

如果一些值已经存在,我如何自动处理想要跳过的情况?例如,如果健康值已经存在——我不想要原型中的原始值。或者,如果库存中已经有项目——我不想从蓝图对象接收项目。

原型对象的序列化/反序列化

您可以这样做:

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"
//   ]
// }

复制自:http://james.newtonking.com/archive/2014/08/04/json-net-6-0-release-4-json-merge-dependency-injection