I cant get my Xml save script to work. I dont know how.

I use Javascript

As the title states, i cant figure out xml and the tutorials i find dont explain it very well either. I looked at the wiki and tried to make this script below, but i have no idea how to write it out… my “stats” are in a seperate script names Statistics.js im attempting to call those variables and save them. What should i do to fix this script?

import System.Xml;
import System.Xml.Serialization;

public var myVit : int;
public var myName : String;

function Update(){

myVit = Statistics.playerVit;
myName = Statistics.playerName; 

}
public class SaveData

{
    myVit;
    myName;

}

// save

function Save(){
	var serializer : XmlSerializer = new XmlSerializer(typeof(SaveData));
	var stream : Stream = new FileStream(path, FileMode.Create);
	serializer.Serialize(stream, this);
	stream.Close();
}

//load

function Load(){
	var serializer : XmlSerializer = new XmlSerializer(typeof(SaveData));
	var stream : Stream = new FileStream(path, FileMode.Open);
	var saveFile : SaveData = serializer.Deserialize(stream) as SaveData;
	stream.Close();
}

//------------------EDIT-------------------//

//-------UPDATED SCRIPT---------//

import System.Xml;
import System.Xml.Serialization;
import System.IO;

public class SaveData

{
    public var myVit : int;
    public var myName : String;

    function Save(){
        var serializer : XmlSerializer = new XmlSerializer(typeof(SaveData));
        var stream : Stream = new FileStream(path, FileMode.Create);
        serializer.Serialize(stream, this);
        stream.Close();
    }

    function Load(){
        var serializer : XmlSerializer = new XmlSerializer(typeof(SaveData));
        var stream : Stream = new FileStream(path, FileMode.Open);
        var saveFile : SaveData = serializer.Deserialize(stream) as SaveData;
        stream.Close();
    }
    function Write(){
        SaveData.Save(Path.Combine(Application.persistentDataPath, "Data.xml"));
    }

    function Read(){
        var myData : SaveData = SaveData.Load(Path.Combine(Application.dataPath, "Data.xml"));
    }

}

i attempted to fix the script, this is what i came up with but i still get errors.

13,46 Unknown identifier: ‘path’.

20,46 Unknown identifier: 'path;.

26,18 An instance of type ‘SaveData’ is required to access non static member ‘Save’.

30,42 An instance of type ‘SaveData’ is required to access non static member ‘Load’.

//------------------EDIT #2----------------------------//

import System.Xml;
import System.Xml.Serialization;
import System.IO;

public class SaveData
 
{
    public var path : String = "";
    public var myVit : int;
    public var myName : String;
 
    function Save(){
        var serializer : XmlSerializer = new XmlSerializer(typeof(SaveData));
        var stream : Stream = new FileStream(path, FileMode.Create);
        serializer.Serialize(stream, this);
        stream.Close();
    }
 
    function Load(){
        var serializer : XmlSerializer = new XmlSerializer(typeof(SaveData));
        var stream : Stream = new FileStream(path, FileMode.Open);
        var saveFile : SaveData = serializer.Deserialize(stream) as SaveData;
        stream.Close();
    }
    function Write(){
        SaveData.Save(Path.Combine(Application.persistentDataPath, "Data.xml"));
    }
 
    function Read(){
        var myData : SaveData = SaveData.Load(Path.Combine(Application.dataPath, "Data.xml"));
    }
    function SaveText(){
    var sd : SaveData = new SaveData();
	sd.myVit = 10;//or something
	sd.myName = "Name";
	sd.Save("PATH TO FILE");
    }
 
}

this is my most recent code.

Errors:

26,18 An instance of type ‘SaveData’ is required to access non static member ‘Save’.

30,42 An instance of type ‘SaveData’ is required to access non static member ‘Load’.

36,16 The best overload for the method ‘SaveData.Save()’ is not compatible with the argument list ‘(String)’.

/--------------Edit Newest Script----------------/

import System.Xml;
import System.Xml.Serialization;
import System.IO;

public class SaveData extends MonoBehaviour
 
{
    public var path : String = "Application.dataPath";
    public var myVit : int;
    public var myName : String;
 
    function Save(path : String){
        var serializer : XmlSerializer = new XmlSerializer(typeof(SaveData));
        var stream : Stream = new FileStream(path, FileMode.Create);
        serializer.Serialize(stream, this);
        stream.Close();
    }
 
    static function Load(path : String){
        var serializer : XmlSerializer = new XmlSerializer(typeof(SaveData));
        var stream : Stream = new FileStream(path, FileMode.Open);
        var saveFile : SaveData = serializer.Deserialize(stream) as SaveData;
        stream.Close();
        
        return saveFile;
    }
    function Write(){
        Save(Path.Combine(path, "Data.xml"));
    }
 
    function Read(){
        var myData : SaveData = SaveData.Load(Path.Combine(path, "Data.xml"));
    }
    function SaveText(){
        var sd : SaveData = new SaveData();
	    sd.myVit = 10;//or something
	    sd.myName = "Name";
	    sd.Save(path);
    }
 
}

I use C# and when you use the XmlSerializer you have to make sure all your variables are public.
So try to do that and see of it works. And since you Serialize SaveData make sure you store your data in there :wink:

Do you get an error message when you run the code?

EDIT:

public class SaveData
{
    public var myVit : int;
    public var myName : string;

    function Save(path : string){
        var serializer : XmlSerializer = new XmlSerializer(typeof(SaveData));
        var stream : Stream = new FileStream(path, FileMode.Create);
        serializer.Serialize(stream, this);
        stream.Close();
    }
}

Somewhere else in your code:

var sd : SaveData = new SaveData();
sd.myVit = 10;//or something
sd.myName = "Name";

sd.Save("PATH TO FILE");

EDIT for new code

You are doing a few things wrong:

function Write(){
    SaveData.Save(Path.Combine(Application.persistentDataPath, "Data.xml"));
}

SaveData is your class and you cannot call non static functions this way. Since this function is in the same class just use

function Write(){
   Save(Path.Combine(Application.persistentDataPath, "Data.xml"));
}

then: function Save(){
change it to function Save(path : string){

your load function is not correct, your load function should be made static and has to have a return type

static function Load() : SaveData{
    var serializer : XmlSerializer = new XmlSerializer(typeof(SaveData));
    var stream : Stream = new FileStream(path, FileMode.Open);
    var saveFile : SaveData = serializer.Deserialize(stream) as SaveData;
    stream.Close();

    return saveFile;
}

That should work, if you have errors make sure the you check the format for JavaScript since I don’t use it, I don’t know if it is correctly written.

first you have to assign data type to your all variable, xml serialize will crash without it…

and be sure you are using .Net 2.0 subset and striping is disabled in player setting