//-----------------------------------------------------------------------------
/**
 \brief Serialization general interface. Serializer API works with:
	- primitive types: int, float, string, bool, vector
	- dynamic containers: array, set, map
	- static arrays
	- complex types: classes
 \note Serializer provides deep serialization (it serialize class memebers and their members etc). To avoid serialization of certain class variable, use NonSerialized attribute.
 \par usage:
 @code
	class MyData
	{
		int m_id;
		autoptr map<string, float> m_values;
	
		[NonSerialized()]
		string m_dbg; // I don't want to serialize this variable
	}

	void Serialize(Serializer s)
	{
		int statArray[4] = {6,9,2,3};
		array<int> dynArray = {8,5,6,4};
		autoptr MyData data = new MyData();
	
		data.m_id = 965;
		data.m_values = map<string, float>;
		data.m_values.Insert("value1", 5.98);
		data.m_values.Insert("value2", 4.36);
	
		s.Write(10);
		s.Write("Hello");
		s.Write(statArray);
		s.Write(dynArray);
		s.Write(data);
	}

	void Deserialize(Serializer s)
	{
		int statArray[4];
		array<int> dynArray;
		MyData data;
		int someInt;
		string someString;	
	
		s.Read(someInt);
		s.Read(someString);
		s.Read(statArray);
		s.Read(dynArray);
		s.Read(data);
	}
 
 @endcode
 */
class Serializer: Managed
{
	proto bool Write(void value_out);
	proto bool Read(void value_in);

	proto native bool CanWrite();
	proto native bool CanRead();
	
	protected void Serializer() {}
	protected void ~Serializer() {}
};

/**
 \brief Serializer API implementation for File IO. See Serializer for more info.
 \n usage:
 @code
void TestSave()
{
	FileSerializer file = new FileSerializer();
	string names[3] = {"alpha", "beta", "gama"};
	
	if (file.Open("test.save", FileMode.WRITE))
	{
		file.Write(10);
		file.Write("lalala");
		file.Write(name);
		file.Close();
	}
}
	
void TestLoad()
{
	FileSerializer file = new FileSerializer();
	int intVal;
	string stringVal;
	string names[3];
		
	if (file.Open("test.save", FileMode.READ))
	{
		file.Read(intVal);
		file.Read(stringVal);
		file.Read(names);
		file.Close();
	}
}	
 
 @endcode
 */
class FileSerializer: Serializer
{
	void FileSerializer() {}
	void ~FileSerializer() {}
	
	proto native bool Open(string path, FileMode mode = FileMode.READ);
	proto native bool IsOpen();
	proto native void Close();
}
	
