2012-06-13 48 views
0

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

我一直在尝试不同的事情,但无法使其工作。

我收到此错误:

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

你能指出我到这里的正确方向?

在此先感谢。

回答

1

你必须让所有的类和子类为Serializable

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

编辑


正如评论请注意下面的类型,你在所有的序列化的字段使用类必须自己可序列化。不用作类结构的一部分的类型或用于非序列化字段的类型不需要是可序列化的。

+4

更具体地说,您需要标记您想要序列化为可序列化的字段上使用的所有类。为了序列化'public tileDataBackground [,] tileBackground''成员,'tileDataBackground'需要可序列化。 (换句话说,除非您在父类型的字段中使用所有子类型,否则不需要将所有子类型标记为可序列化,在这种情况下是正确的,但这是一个重要区别。) – cdhowie

+0

你非常希望得到答复,它解决了我的问题。 奇怪的是,我记得试图把[Serializable]放在子类的顶部,并得到一个错误。 我想我已经犯了一个打字错误。 – Theoden