У меня есть небольшая проблема с получением 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();
}
}
Вы можете включить код сериализации? –
Я обновил вопрос – Gibbo
Это выглядит нормально. Как вы инициализируете поле ID в классе Tile? –