在可序列化类中存储引用(C# - XNA)

时间:2012-12-27 00:11:47

标签: c# serialization reference xna-4.0

过去几周我一直在XNA创建游戏。在这个过程中,我试图在遇到问题之前解决问题而不完全理解问题。

问题在于我是如何处理保存和检索“蓝图”对象的。由于我正在制作的内容创建者(游戏是基于内容的),我需要此功能。所以目标是,我创建内容(粗略的例子,一个类型为“Goblin”的敌人,100个生命值和一个精灵精灵),将它保存到序列化对象,将其加载到游戏中,然后它可用并可复制到-游戏。

现在很明显,当对象具有像Texture2D(精灵)这样不可序列化的东西时,你无法对它们进行序列化。我通过将所有纹理添加到静态类并且仅将索引存储到对象中的纹理(例如,而不是包含Texture2D属性,而不是包含Texture2D属性,)来解决具有精灵(项目,NPC,字符等)的地图和对象的问题。地精将包含链接到适当纹理的索引 - 稍微过于简单,但你明白了。)

然后病毒传播了,我开始为我的所有对象引用做这件事。例如,地精还需要对AI对象的引用。 AI对象只有方法,因此显然是可序列化的,但我将它存储在与我的纹理相同的静态类中,并通过索引链接到它。现在回想起来,我对自己的想法感到不寒而栗。

所以我的问题是,除了纹理之外的所有内容是否应该通过直接引用存储在可序列化的类中,而不是通过索引引用?或者有没有可行的理由去做我做过的事情?

序列化是一项棘手的业务,我正试图围绕使用它的最佳方式以及正确的时间来避免它。

1 个答案:

答案 0 :(得分:2)

正如您所说,序列化无法跟踪引用。要么序列化整个对象图,要么在反序列化时提出自己解决引用的方法。所以你所做的是正确的事情,尽管你可能想找到一个更好的解决方案而不是从静态类中挂起所有东西。

此外,您可能想要更改策略。您可以只保存所需的信息,而不是使用所有索引保存对象本身,然后使用解析器工厂来读取此信息并使用正确的值填充对象。