首页 > 解决方案 > 是否可以在 C# 中为 KeyValuePairs 的 LinkedList 创建序列化代理?

问题描述

目前正在尝试在一个统一项目中实现一个保存和加载系统,以便能够保存和重新加载游戏的状态。该项目类似于桌面纸牌游戏,其中有纸牌和纸牌。卡片堆包含 KeyValuePairs 的 LinkedList,每个节点包含一张卡片及其在堆中的方向(true = up,false = down)。这看起来像这样:

LinkedList<KeyValuePairs<Cards,bool>> cardsList

我们已经使用序列化代理正确地保存了项目中对象的位置、旋转和类型,但是其中的卡片列表没有保存。我们将如何为这种 LinkedList 创建一个序列化代理项,因为它需要保存和加载?我们已经尝试以不同的方式实现这一点,但到目前为止没有运气,任何帮助将不胜感激。

编辑:抱歉忘了提到我们为此使用二进制格式化程序而不是 XML

标签: c#unity3dserializationlinked-listkeyvaluepair

解决方案


感谢您的回复,我们已通过创建自定义链表序列化代理来解决此问题,该代理遍历链表并使用基于列表中位置的唯一引用将每个节点保存到文件中。从文件加载数据时,我们可以使用相同的唯一引用以正确的顺序检索正确的节点。下面是展示我们如何做到这一点的代码片段(我们意识到这可能不是最有效的方式,但它可以满足我们的需求):

将数据保存到文件:

   `int num = 0;
    info.AddValue("count", cardsList.Count);
    foreach (KeyValuePair<Cards,bool> el in cardsList){
        info.AddValue(num + "id", el.Key.ID);
        info.AddValue(num + "faceUp", el.Value);
        num++;
    }`

从文件加载数据:

   `int count = (int)info.GetValue("count", typeof(int));
    string id = "";
    bool faceUp;
    for (int i = 0; i < count; i++)
    {
        id = (string)info.GetValue(i + "id", typeof(string));
        faceUp = (bool)info.GetValue(i + "faceUp", typeof(bool));
        linkedList.AddLast(new KeyValuePair<Cards,bool>(gameController.FindCard(id), faceUp));
    }`

推荐阅读