持久存储对象类型标识符

时间:2014-06-05 00:07:25

标签: c# types persistence

我读过数据库主要用于存储更改的数据,业务逻辑数据应该驻留在程序可执行文件中。

如果是这种情况,如何以可在下一个会话中重新水化的方式表示运行时实例之间的关系?

假设我有一个游戏,其中玩家装备了“千千万万之剑”。在C#中,我将其描述为类型的实例:var s = new SwordOf100Truths()并将其与玩家的广告资源相关联:pc.Equip("MainHand", s)。然后玩家保存游戏并退出。

当该播放器重新登录时,我需要知道如何重新创建其广告资源。

当然,我可以在SQL中为每种可能的项类型存储记录(GameObject.Equipment.Weapon.Sword.SwordOf100Truths,GameObject.Consumeable.Potion.HealthRank3 ...),然后有一个PlayerInventories表,它将获得一个新的记录键入该特定项目ID。然后当玩家重新登录时,我会解析类型名称并创建它的实例。但这似乎非常低效。

或者我可以将对象的类型名称存储在库存表中并重新创建它,而不必存储所有可能的项目。

Table PlayerInventories Id,PlayerId,TypeName,InventorySlot

foreach(item in GetPlayerInventoryData(playerId))
{
    pc.Equip(item.InventorySlot, Activator.CreateInstance(type.GetType(item.TypeName)));
}

这是要走的路吗?人们如何处理这个问题?

1 个答案:

答案 0 :(得分:1)

您已经将播放器视为一个对象,将其作为对象的项目 - 也以这种方式存储它们。不需要去关系。将整个玩家的对象图存储为单个实体。有许多工具和技术可以实现这一目标。我已经使用BSON和JSON来表示对象,它们可以轻松地进行序列化\反序列化,并且可以放在任何数据存储中。如果您在前端使用javascript,JSON很不错,因为您可以直接使用它。

这也意味着您可以随时添加对象而无需重做数据库,只要您可以序列化对象,就可以保存它并重新构建它。