【问题标题】:Serialize A List That Contains Arrays & Other Lists序列化包含数组和其他列表的列表
【发布时间】:2012-06-13 15:32:24
【问题描述】:

我一直在尝试序列化一个包含数组和列表的列表。

我一直在尝试不同的事情,但无法成功。

我收到此错误:

Type 'EngineTest.MapData+tileDataBackground' in Assembly 'EngineTest, Version=1.0.0.0,
   Culture=neutral, PublicKeyToken=null' is not marked as serializable.

这是我试图在列表中序列化的 MapData.cs。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EngineTest
{
[Serializable]
public class MapData
{
    public struct tileDataBackground
    {
        public int tileTextureX;
        public int tileTextureY;
    }

    public struct tileDataForeground
    {
        public int tileTextureX;
        public int tileTextureY;
    }

    public struct tileDataCollision
    {
        public bool tileCollision;
    }

    public tileDataBackground[,] tileBackground;
    public tileDataForeground[,] tileForeground;
    public tileDataCollision[,] tileCollision;


    public List<items> itemData = new List<items>();
    public List<functions> functionData = new List<functions>();
}
}

这是我无法序列化它的代码(Program.mapData 是列表):

        using (FileStream stream = File.Open("test.dat", FileMode.Create))
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, Program.mapData);
            stream.Close();
        }

你能指出我正确的方向吗?

提前致谢。

【问题讨论】:

    标签: c# arrays class list serialization


    【解决方案1】:

    您必须将所有类和子类设为可序列化

    [Serializable]
    public class MapData
    {
        [Serializable]
        public struct tileDataBackground
        {
            public int tileTextureX;
            public int tileTextureY;
        }
     ...
    

    编辑


    正如 cmets 所指出的,您在所有可序列化类的字段中使用的类型必须它们本身是可序列化的。不用作类结构的一部分或在 nonSerializable 字段中使用的类型不需要是 Serializable。

    【讨论】:

    • 更具体地说,您需要将要序列化的字段上使用的所有类标记为可序列化。例如,要序列化 ​​public tileDataBackground[,] tileBackground; 成员,tileDataBackground 需要可序列化。 (换句话说,您不需要将 all 子类型标记为可序列化,除非您在父类型中的字段上使用所有子类型——在这种情况下确实如此,但它很重要区别。)
    • 非常感谢您的回复,它解决了我的问题。奇怪的是,我记得我试图将 [Serializable] 放在子类的顶部并得到一个错误。我想我打错字了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2021-02-27
    相关资源
    最近更新 更多