C# 如何序列化XNA中的对象列表?

C# 如何序列化XNA中的对象列表?,c#,xna-4.0,C#,Xna 4.0,我有一个要添加到游戏中的积木列表(有点像minecraft),我有一个可以工作的序列化函数,但是我不知道如何保存与列表对应的每个积木位置 比如说, drive = StorageDevice.EndShowSelector(result); if (drive != null && drive.IsConnected) { SaveGame SaveData = new SaveGame()

我有一个要添加到游戏中的积木列表(有点像minecraft),我有一个可以工作的序列化函数,但是我不知道如何保存与列表对应的每个积木位置

比如说,

    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();

            }
这就是它的保存方式,当我调用前面名为initiate saves的方法时,它会保存积分(如分数)和向量(如球员位置),但是,无论如何,重新传递到块位置不会导致加载时发生任何事情(除了球员位置更新和分数更新)

如果这是在更新循环中,我可以简单地像普通一样计算对象:

      for (int b = 0; b < game.blocklist.Count; b++)
        {
            //etc..
         }

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

我很惊讶这一点从未得到回答,但我理解正确吗?你问的是如何序列化块的列表(或数组)

我的回答假设您的整个类是可序列化的:

如果要将每个实体(如块)存储在列表中,则可以使用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;
使用System.Xml.Serialization;
使用System.IO;
[可序列化()]
公共类MyClass
{
私有列表m_块=新列表();
[XMLArray(“项”)]
公共列表块{
获取{返回m_块;}
设置{m_Blocks=value;}
};
//……其他成员
}
。。。只要对象中的所有字段都是可序列化的对象或值类型,就可以使用


之后,您可以使用与任何非XNA应用程序相同的方式对其进行序列化。

我真的不理解这个问题。您没有访问阻止列表的权限吗?你可以先序列化列表,然后再取消序列化。我不知道如何序列化它,这就是问题所在,我需要保存每个块的位置,但一切都不起作用
    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;
            }

        }
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
}