2017-02-12 1 views
3

Der Versuch, .dat-Datei auf seine eigene KlasseGussobjekt Klasse C#

level0 = (Level0) LoadObjInBinary(level0, "Level" + levelNumber); 

    public static object LoadObjInBinary(object myClass, string fileName) { 
     fileName += ".dat"; 
     if (File.Exists(FileLocation + fileName)) { 
      BinaryFormatter bf = new BinaryFormatter(); 
      FileStream file = File.Open(FileLocation + fileName, FileMode.Open); 
      myClass = bf.Deserialize(file); 
      file.Close(); 
      return myClass; 
     } else { 
      return null; 
     } 
    } 


Level() class 

    [Serializable] 
    public class Level0 { //Using this class to create Level.dat binary file 

     static int level = 1; 
     static int moves = 15; 
     static int seconds; 
     static int minScoreForOneStar = 1000; 
     static int minScoreForTwoStars = 1500; 
     static int minScoreForThreeStars = 2000; 

     static TargetObj[] targetObjs = {new TargetObj(Targets.Black, 10), new TargetObj(Targets.Freezer, 1), new TargetObj(Targets.Anchor, 2)}; 

     static Color[] colors = {Constants.grey, Constants.green, Constants.pink, Constants.brown, Constants.purple, Constants.lightBlue}; 

     static Cell[,] levelDesign; 

     //the rest is Properties of Fields 

    } 

Problem zu werfen: Rückkehr LoadObjInBinary null. Der Dateipfad ist richtig und Klasse auch paßt, aber nicht wissen, warum „(Level0) Objekt“ nicht funktioniert ...

Dank

+0

Sie auch die BinaryFormatter verwendet, um eine 'Level0' Typ zu serialisiert? Nur für die Wissenschaft: Kann man 'return null;' durch 'return new Level0();' ersetzen. Ich möchte überprüfen, ob der Pfad korrekt ist oder nicht. – rene

+1

nichts geändert, die Datei existiert und es gibt zurückliegendes Objekt aber kann es nicht auf Level0() werfen Und ja, ich habe BinaryFormatter zu serialisieren – MJahongir

+0

Können Sie zusätzliche Informationen für die Klasse Level0 bereitstellen. Ist es als serialisierbar gekennzeichnet? Enthält es zusätzliche Member, die ebenfalls einen benutzerdefinierten Typ aufweisen? – Vect0rZ

Antwort

2

Danke die Level0 Klasse für die Bereitstellung.

Das Problem ist, dass statische Felder nie serialisiert werden, da sie nicht zu der Instanz des Objekts gehören, das Sie angeben, sie sind global.

Da ich davon ausgehe, dass sie statisch sein müssen, damit sie von allen Teilen Ihrer Anwendung aus zugänglich sind, besteht die schnelle Umgehung darin, eine andere Klasse mit nicht statischen Membern zu erstellen, dann serialisieren, deserialisieren und zuweisen Es sind Werte für die globale statische Instanz von Level0 (wo auch immer Sie es verwenden).

[Serializable] 
class Level0Data 
{ 
    int level = 1; 
    int moves = 15; 
    int seconds; 
    int minScoreForOneStar = 1000; 
    ... 
} 

Dann nach Serialisierung und Deserialisierung können Sie Folgendes tun.

Level0Data deserializedObject = (Level0Data) LoadObjInBinary(..); 
Level0.level = deserializedObject.level; 
Level0.moves = deserializedObject.moves; 

Wie Sie müssen sicherstellen, dass Level0.level, bewegt und alle anderen Mitglieder öffentlich sind, oder zumindest öffentlich zugänglich für die Modifikation in einer anderen Art und Weise.

Additionaly müssen Sie sicherstellen, dass

class TargetObj{} 
class Cell{} 

auch als Serializable markiert sind, sonst werden sie nicht auf die Datei geschrieben werden, noch eine Deserialisierung Informationen über sie.

EDIT

Hier können Sie alle in Unity unterstützt finden standardmäßig serializable Typen:

Unity SerializeField

+1

Vielen Dank, es hat funktioniert, auch ich habe Farbe [] hinzugefügt, die nicht serialisierbar ist ich änderte es String [] der Farbe hex Werte – MJahongir

+1

Great! Und über die Farbe, ja, ich denke, nur die neueste Version von Unity unterstützt seine Serialisierung von Primitiven. – Vect0rZ