如何在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;
            }
        }

然后相应地更新黑名单。现在我的问题是,我不知道如何保存每个的块列表项的位置,以便他们可以再次加载命令

如何在XNA中序列化对象列表

我很惊讶这个问题从来没有得到回答,但我的理解是正确的-你问如何序列化你的块列表(或数组)?

我的答案假设你的整个类是可序列化的:

如果您要在列表中存储每个实体(例如您的块),您可以使用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一样序列化它。