如何在XNA中序列化对象列表
本文关键字:序列化 对象 列表 XNA | 更新日期: 2023-09-27 18:15:00
我有一个要添加到游戏中的块列表(有点像我的世界),我有一个工作的序列化函数,但我对如何保存每个块位置对应于列表感到困惑。
例如
drive = StorageDevice.EndShowSelector(result);
if (drive != null && drive.IsConnected)
{
SaveGame SaveData = new SaveGame()
{
playerpos = player.playerPosition,
lvl = Level,
exp = Exp,
munny = Money,
};
IAsyncResult r = drive.BeginOpenContainer(containerName, null, null);
//etc... etc..
stream.Close();
container.Dispose();
result.AsyncWaitHandle.Close();
}
这就是它保存的方式,当我调用之前的方法initiationsave时,它保存了像分数这样的int和像球员位置这样的Vector2s,然而,引用块位置无论如何都不会在加载时发生任何事情(除了球员位置更新和分数更新)。
如果这是在一个更新循环中,我可以简单地计数对象,就像正常的:
for (int b = 0; b < game.blocklist.Count; b++)
{
//etc..
}
然而,这不是在更新循环中,我很困惑发生了什么。
编辑:为了使我的问题更清楚,我不确切地知道如何序列化我的存储类 中的列表例如,我通常是这样在我的游戏构造器中设置列表的: public List<Builder> blocklist = new List<Builder>();
然后我可以使用Builder类中存在的参数将块添加到块列表中,如下所示
if (player.Builder == true && player.LMBpressed == true && blockspawnamount >= placeblock)
{
if (build.BlockID == 1)
{
position = new Vector2((int)(cursor.cursorPos.X / 58) * 58, (int)(cursor.cursorPos.Y / 58) * 58);
blocktex1 = grass1;
block = new Builder(this, blocktex1, new Vector2(position.X, position.Y));
blocklist.Add(block);
placeblock = 200.0f;
}
}
然后相应地更新黑名单。现在我的问题是,我不知道如何保存每个的块列表项的位置,以便他们可以再次加载命令
我很惊讶这个问题从来没有得到回答,但我的理解是正确的-你问如何序列化你的块列表(或数组)?
我的答案假设你的整个类是可序列化的:
如果您要在列表中存储每个实体(例如您的块),您可以使用XMLArray()属性:
using System.Xml;
using System.Xml.Serialization;
using System.IO;
[Serializable()]
public class MyClass
{
private list<blocks> m_Blocks = new List<block>();
[XMLArray("Items")]
public list<block> Blocks{
get{ return m_blocks; }
set{ m_Blocks = value; }
};
// ... other members
}
…只要对象中的所有字段都是可序列化的对象或值类型,这应该就可以工作。
之后,您可以像使用System.XML.Serialization.XMLSerializer一样序列化它。