Skocz do zawartości

[C#] Serializacja tablicy do pliku


Rekomendowane odpowiedzi

Robiąc w unity natknąłem się na problem zapisu customowej klasy do pliku, która zawiera tablice.

Nie korzystam tutaj z serializacji wbudowanej w unity tylko z tej domyślnej z .net

 

Mam sobie taką klasę i ją chcę zapisać do pliku

GML
[Serializable]

public class ArraysToSerialize

{

public int[] mapUnlocked = new int[] { 1, 1, 1, 1, 0, 0, 0, 0 };

}

 

Zapis:

GML
public ArraysToSerialize Arrays = new ArraysToSerialize();

BinaryFormatter bf3 = new BinaryFormatter();

FileStream file3 = File.Create(Application.persistentDataPath + "/arrays.dat");

 

bf3.Serialize(file3, Arrays);

file3.Close();

 

Wczytywanie:

GML
// 3 plik

if (File.Exists(Application.persistentDataPath + "/arrays.dat"))

{

var b = new BinaryFormatter();

var f = File.Open(Application.persistentDataPath + "/arrays.dat", FileMode.Open);

ArraysToSerialize arrays = (ArraysToSerialize)b.Deserialize(f);

f.Close();

mapUnlocked = arrays.mapUnlocked;

}

else { Debug.LogError("No file to load"); }

 

No i to działa tak że jeżeli nie znajdzie pliku to wczytywanie jest pomijane a gra mi później ten plik tworzy. Potem jak się ją uruchomi ponownie to plik już istnieje i wszystko się poprawnie wczytuje.

 

Ale problem się pojawia wtedy kiedy zechcę dopisać do klasy ArraysToSerialize kolejną tablicę do zapisu do pliku.

Np.

GML
[Serializable]

public class ArraysToSerialize

{

public int[] mapUnlocked = new int[] { 1, 1, 1, 1, 0, 0, 0, 0 };

public int[] nowaTablica = new int[] { 0, 3, 2, 4, 6, 5 };

}

Bo wtedy plik "arrays.dat" już istnieje ale wewnątrz niego nie ma tablicy nowaTablica i wywala error przy wczytywaniu. Żeby to zadziałało musiał bym usunąć ręcznie plik "arrays.dat" i wtedy gra by sobie go na nowo poprawnie zapisała.

 

Słyszałem że do takich rzeczy wykorzystuje się try, catch, finally ale nie mam pojęcia jak to działa.

Odnośnik do komentarza
Udostępnij na innych stronach

Newtonsoft.Json

Odnośnik do komentarza
Udostępnij na innych stronach

jest wersja tej libki pod unity :)

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

A nie można tablic kolejno zapisac do pliku przez:

var values = string.Join(",", Array.ConvertAll<int, String>(tablica, Convert.ToString));

A odczytać przez:

string values = "1,2,3,4,5,6,7,8,9,10";
string[] tokens = values.Split(',');
int[] tablica = Array.ConvertAll<string, int>(tokens, int.Parse);

 

Tak jak w PHP korzysta się z implode/explode ?

Odnośnik do komentarza
Udostępnij na innych stronach

zdaje sie to to: http://json.codeplex.com

używamy tego w pracy, na pewno dziala linkowane ze zrodel do projektu unity.

Odnośnik do komentarza
Udostępnij na innych stronach

wrzucic zrodla tego projektu do kodu projektu unity? :D

Odnośnik do komentarza
Udostępnij na innych stronach

Tamto co podał Psyś nie jest dostosowane do unity. Poszukałem czegoś łatwego i znalazłem to: http://wiki.unity3d.com/index.php/SimpleJSON

Ta biblioteka ma jedną wadę że wszystko wczytuje jako stringa, niezależnie od tego czy wartości to int, bool, null. I trzeba ręcznie każdą wartość tablicy w pętli konwertować albo czegoś nie rozumiem :D

 

Anyway takie coś zrobiłem i działa dobrze:

Wczytywanie z uwzględnieniem braku pliku.

GML
if (File.Exists(Application.persistentDataPath + "/Arrays.json"))

{

JSON_Node = JSONNode.LoadFromFile(Application.persistentDataPath + "/Arrays.json"); // wczytywanie pliku JSON

Debug.Log("Loaded " + JSON_Node["MapUnlocked"].ToString()); // wypisanie zawartosci tablicy w konsoli

// konwertowanie tablicy JSON (string na int)

for (int i = 0; i < JSON_Node["MapUnlocked"].Count; i++)

{

mapUnlocked = JSON_Node["MapUnlocked"].AsInt;

}

}

else

{

// tworzenie nowego pliku JSON z początkowymi wartościami

JSON_Node = JSONNode.Parse("{\"MapUnlocked\":[1,1,1,1,0,0,0,0]}");

Debug.Log("Created file " + JSON_Node.ToString());

JSON_Node.SaveToFile(Application.persistentDataPath + "/Arrays.json");

}

 

Zapis:

GML
for (int i = 0; i < mapUnlocked.Length; i++)

{

JSON_Node["MapUnlocked"].AsInt = mapUnlocked;

}

Debug.LogWarning( "Saved "+JSON_Node["MapUnlocked"].ToString(" ") );

JSON_Node.SaveToFile(Application.persistentDataPath + "/Arrays.json");

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...