Wpis z mikrobloga

Hej zna ktoś jakiś prosty i przyjemny sposób zapisu do pliku customowej klasy w której poza listami stringów, intów etc. jest też lista zawierająca inne customowe klasy w skład których wchodzą listy stringów,intów etc. Do chwili obecnej korzystałem z serializacji binarnej przez binary formater i wszystko ładnie się zapisywała do pliku i odczytywało.
Aktualnie odradza się taki sposób zapisywania ze względów bezpieczeństwa.
Kombinowałem z jsonem ale on jakby nie chce mi zapisywać listy z własnymi klasami, dopiero gdy te dane rozbije na osobne tabele to mi je zapisuje i zczytuje. Dla wygody wolał bym po prostu dane klasy wrzucać do odpowiednich list i całe takie listy zapisywać.
Nie wiem czy jasno to opisałem. Może coś mi umknęło przy jsonie albo coś robię źle. Może ktoś doradzi jakiś inny sposób?


#csharp #unity #programowanie
  • 30
via Wykop Mobilny (Android)
  • 1
@Fat_Mo: nie jestem z c# ale czy wszystkie te klasy które trzymasz w liście mają metody toJSON bądź inaczej brzmiącą? Jeśli nie, to powinieneś móc je dodać do własnych klas i wtedy powinno działać.
@Fat_Mo: W unity musisz dać [Serializable] atrybut nad klasa strukturą żeby automatycznie zapisywało np w ScriptableObject. Do Jsona uzywasz newtonsoft
var output = JsonConvert.SerializeObject(product);
i
Product deserializedProduct = JsonConvert.DeserializeObject(output);

działa bez żadnych dodatkowych rzeczy
@Fat_Mo: jeśli zapisywane obiekty nie powtarzają się i nie występują referencje pomiędzy nimi, sprawę powinna załatwić zwykła serializacja bez żadnych dodatkowych opcji. Jeśli zapisujesz obiekty różnych typów w ramach jednej kolekcji, trzeba w opcjach JSONa ustawić zapisywanie i odczytywanie typów.

Możesz też do celów zapisu i odczytu stworzyć jakąś łatwo serializowalną klasę kontenerową, która obsłuży serializację, deserializację i przechowywanie danych.
@MostlyRenegade:

Dokładnie listy tej klasy nie mogłem odczytać po zapisie.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
[Serializable]
public class ScoreInfo
{
public string stageName;
public int jumps;
public float time;
public int objectDestroyed;

public ScoreInfo()
{

}

public ScoreInfo(string sName,int j,float t, int objD)
{
stageName = sName;
jumps = j;
time = t;
objectDestroyed =objD;
}

public void ChangeThisScore(ScoreInfo newInfo)
{
jumps = newInfo.jumps;
time = newInfo.time;
objectDestroyed=newInfo.objectDestroyed;
@MostlyRenegade: aktualnie mam to tak zrobione żeby działało

[Serializable]
public class SaveNode // << klasa z danymi
{
public string language;
public int colectedCrystal;
public List levelUnlocked = new List();
public List stageHistory = new List();
public List tutTips = new List();
public List testList = new List();
public int jumpCount;

public bool SaveNodeData() //<(lJson);

foreach (var item in loadedNode.testList)
{
Debug.Log(item + "<--item");

ScoreInfo tmpSi = new ScoreInfo();
tmpSi =
@MostlyRenegade: wolał bym jakoś to ogarnąć na poczet przyszłych projektów, żeby sobie całego takiego "SaveNoda" poprostu do pliku wsadzać z różnymi listami różnych klas i go wczytywać.
@MostlyRenegade: chodzi mi o ten fragment dla: public List stageHistory

żeby tego nie konwertować w ten sposob:

foreach (var item in stageHistory)
{
testList.Add(item.ToString());

}

czy dało by radę całego SaveNoda skonwertować jakoś gdybym miał tam jeszcze inne listy obiektów?
@MostlyRenegade: > a jeśli tego nie dasz, to co się stanie?
Zapisywało listę ale wartości obiektów już nie, były wyzerowane. Pomimo tego, że przed zapisem wszystko było ok w liście.
No tutaj ten Monobehevior dużo problemów robi. Myślałem, że może coś przeoczyłem ale widocznie tak jest w tym unity i tyle.
Dzięki za pomoc.
@Fat_Mo: czekaj, czekaj. Coś mi się tu nie zgadza. Ten ostatni wklejony kod to jest jedna klasa?
W metodzie SaveNodeData tworzysz nowy obiekt SaveNode, ale tam w pętli foreach odnosisz się do pól obiektu, spod którego wywołujesz tę funkcję.