【问题标题】:Storing references in serializable classes (C# - XNA)在可序列化的类中存储引用 (C# - XNA)
【发布时间】:2012-12-27 08:21:04
【问题描述】:

过去几周我一直在 XNA 中创建游戏。在这个过程中,我在没有完全理解问题的情况下,试图在遇到问题之前解决它。

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

现在很明显,当对象具有像 Texture2D(精灵)这样的不可序列化的东西时,你不能序列化它们。我通过将我的所有纹理添加到静态类并仅存储对象中纹理的索引(例如,不包含 Texture2D 属性, Goblin 将包含一个链接到适当纹理的索引 - 有点过于简单,但你明白了)。

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

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

序列化是一项棘手的工作,我正在努力思考使用它的最佳方法以及避免它的正确时间。

【问题讨论】:

  • 另外,我不怕听到冷酷的事实(我犯了一个可怕的错误)。作为我的内容创建工具加载和保存对象的一种方式,我的静态类仍然很方便。

标签: c# serialization reference xna-4.0


【解决方案1】:

正如您所说,序列化无法跟踪引用。要么序列化整个对象图,要么在反序列化时提出自己的解决引用的方法。因此,您所做的事情是正确的,尽管您可能希望找到更好的解决方案,而不是仅仅将所有内容都挂在静态类中。

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

【讨论】:

  • 序列化所有对象会有什么问题?什么是更好的解决方案?
  • +1。我注意到序列化上下文中的“引用”不应与 C#/CLR 概念中的“引用与值类型”相混淆。看看“拥有/包含”(即地精包含最大生命值计数器)和“指代”(即地精指的是某些创建 AI 和纹理)听起来是否更好......
  • 我能想到两个问题:1)你会序列化所有东西的副本。例如,您的模型使用的任何共享纹理都会在您每次保存模型时保存。此外,在反序列化时,每个实例都将拥有自己的文本副本(因此首先破坏了共享纹理的目的)2)您最终可能会序列化比您想要的更多。虽然可以指定要序列化的字段,但可能会发生看似无辜的引用可能会拉取大量相关对象。
  • 啊,我明白了。现在很有意义(我不知道重复复制问题)。
  • @Djentleman,这是你的项目——我们不知道为什么序列化所有对象对你来说是个问题。但是无论您决定做什么,请确保正确序列化被多个对象引用的共享对象(即“剑”可以被您的一半生物引用,但仍然可能需要在序列化数据中是单个共享实例)并查看是否你需要处理周期(不太可能像你现在遇到的那样)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 2017-05-22
  • 1970-01-01
  • 2012-04-07
  • 2011-10-07
  • 2012-12-13
  • 1970-01-01
相关资源
最近更新 更多