2014-11-28 3 views
0

У меня есть небольшая проблема с получением BinaryFormatter, чтобы фактически сериализовать это одно поле.BinaryFormatter не сериализующее поле

У меня есть класс Tile, и я сериализую его положение и идентификатор, а затем сохраняю все эти плитки с помощью BinaryFormatter. Каждое другое поле не сериализуется и инициализируется с использованием значения идентификатора.

Однако поле ID просто не будет сериализоваться, но все остальное сделает. Что может быть причиной этого?

Вот мои плитки поля:

 // The ID of this tile 
    private int id; 
    // The name visible for the tile in the map editor 
    [NonSerialized] private String name; 
    // The file location for this tile for loading a texture 
    [NonSerialized] private String fileName; 

    // Sprite for drawing this tile 
    [NonSerialized] private Sprite sprite; 
    private Transform transform = new Transform(); 

    // If this tile is blocked, blocked tiles can not be walked over are classes as "unpassable" 
    [NonSerialized] private bool blocked; 
    // Used to determine if a specific tower types can be placed on this tile, if any 
    [NonSerialized] private short towerMask; 
    // The tower that is placed on this tile, if any 
    [NonSerialized] private Tower tower; 
    // A path generated for enemies to navigate from this tile to another, used for tiles that can spawn enemies 
    [NonSerialized] private Path path; 

Когда я загрузить карту, я делаю это:

  map = MapSerializer.Load("test"); 

А класс MapSerializer просто обычная установка, со статической нагрузкой и сохранить метод, подобный этому:

 public static Map Load(string filename){ 
     Map map; 
     String path = Path.Combine("maps/", filename+".mp"); 
     BinaryFormatter formatter = new BinaryFormatter(); 

     FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read); 

     try{ 
      Trace.WriteLine("Loading map from " + path, "Map Serialization"); 
      map = (Map) formatter.Deserialize(stream); 
      Trace.WriteLine("Map Loaded!", "Map Serialization"); 
     } 
     finally{ 
      stream.Close(); 
     } 

     return map; 
    } 

Другое раздражает это, когда плитки загружены, он не вызывает no args co nstructor. Что с этим? Мне нужно вручную перебрать все фрагменты и вызвать Create(), несмотря на то, что он вызывается в конструкторе no args.

Любые идеи, что одно поле int не записывает на диск?

EDIT:

код сериализации:

public static void Save(Map data, String filename){ 
     String path = Path.Combine("maps/", filename + ".mp"); 
     BinaryFormatter formatter = new BinaryFormatter(); 

     if (!Directory.Exists("maps")) 
      Directory.CreateDirectory("maps"); 
     FileStream stream = File.Open(path, FileMode.Create); 

     try{ 
      Trace.WriteLine("Writing map to " + path, "Map Serialization"); 
      formatter.Serialize(stream, data); 
      Trace.WriteLine("Map Saved!", "Map Serialization"); 
     } 
     catch (SerializationException e){ 
      Trace.WriteLine("Failed to save map : Error - " + e.Message); 
      throw; 
     } 
     finally{ 
      // Close the file 
      stream.Close(); 
     } 
    } 
+0

Вы можете включить код сериализации? –

+0

Я обновил вопрос – Gibbo

+0

Это выглядит нормально. Как вы инициализируете поле ID в классе Tile? –

ответ

0

Вы не разместили код сериализации. К вашему второму вопросу ...

Сериализация не будет вызывать конструктор по умолчанию. Если вы реализуете ISerializable, тогда будет вызываться конструктор, содержащий аргументы сериализации.

Альтернативой является внедрение System.Runtime.Serialization.IDeserializationCallback. Подробнее см. Здесь link.

Другой альтернативой является украшение метода атрибутом OnDeserialized.

+0

Да, я обнаружил IDeserializationCallback вскоре после публикации, это одна проблема исправлена. – Gibbo

Смежные вопросы