Задать вопрос
@XDecent

Как мне конвертировать binary в bytes []?

Для сохранений в моей игре я использую BinarySerializer,но для сохранений в Google Play Games мне нужно как-то конвертировать мои сохранения в массив bytes []
using UnityEngine;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

public class BinarySerializer
{
	static string folderName = "GameData";

	static string persistentDataPath = Application.persistentDataPath;
	static SurrogateSelector surrogateSelector = GetSurrogateSelector ();

	/// <summary>
	/// Save data to disk.
	/// </summary>
	/// <param name="data">your dataClass instance.</param>
	/// <param name="filename">the file where you want to save data.</param>
	/// <returns></returns>
	public static void Save <T> (T data, string filename)
	{
		if (IsSerializable <T> ()) {
			if (!Directory.Exists (GetDirectoryPath ()))
				Directory.CreateDirectory (GetDirectoryPath ());

			BinaryFormatter formatter = new BinaryFormatter ();

			formatter.SurrogateSelector = surrogateSelector;

			FileStream file = File.Create (GetFilePath (filename));

			formatter.Serialize (file, data);

			file.Close ();
		}
	}

	/// <summary>
	/// Save data to disk.
	/// </summary>
	/// <param name="filename">the file where you saved data.</param>
	/// <returns></returns>
	public static T Load<T> (string filename)
	{
		T data = System.Activator.CreateInstance <T> ();

		if (IsSerializable <T> ()) {
			if (HasSaved (filename)) {
				
				BinaryFormatter formatter = new BinaryFormatter ();

				formatter.SurrogateSelector = surrogateSelector;

				FileStream file = File.Open (GetFilePath (filename), FileMode.Open);

				data = (T)formatter.Deserialize (file);

				file.Close ();
			}
		}

		return data;
	}

	static bool IsSerializable<T> ()
	{
		bool isSerializable = typeof(T).IsSerializable;
		if (!isSerializable) {
			string type = typeof(T).ToString ();
			Debug.LogError (
				"Class <b><color=white>" + type + "</color></b> is not marked as Serializable, "
				+ "make sure to add <b><color=white>[System.Serializable]</color></b> at the top of your " + type + " class."
			);
		}

		return isSerializable;
	}


	/// <summary>
	/// Check if data is saved.
	/// </summary>
	/// <param name="filename">the file where you saved data</param>
	/// <returns></returns>
	public static bool HasSaved (string filename)
	{
		return File.Exists (GetFilePath (filename));
	}

	static string GetDirectoryPath ()
	{
		return persistentDataPath + "/" + folderName;
	}

	static string GetFilePath (string filename)
	{
		return  GetDirectoryPath () + "/" + filename;
	}


	//Other non-serialized types /// SS: Serialization Surrogate
	//Vector2 , Vector3 , Vector4 , Color , Quaternion.

	static SurrogateSelector GetSurrogateSelector ()
	{
		SurrogateSelector surrogateSelector = new SurrogateSelector ();

		Vector2_SS v2_ss = new Vector2_SS ();
		Vector3_SS v3_ss = new Vector3_SS (); 
		Vector4_SS v4_ss = new Vector4_SS (); 
		Color_SS co_ss = new Color_SS ();
		Quaternion_SS qu_ss = new Quaternion_SS ();

		surrogateSelector.AddSurrogate (typeof(Vector2), new StreamingContext (StreamingContextStates.All), v2_ss);
		surrogateSelector.AddSurrogate (typeof(Vector3), new StreamingContext (StreamingContextStates.All), v3_ss);
		surrogateSelector.AddSurrogate (typeof(Vector4), new StreamingContext (StreamingContextStates.All), v4_ss);
		surrogateSelector.AddSurrogate (typeof(Color), new StreamingContext (StreamingContextStates.All), co_ss);
		surrogateSelector.AddSurrogate (typeof(Quaternion), new StreamingContext (StreamingContextStates.All), qu_ss);

		return surrogateSelector;
	}

	class Vector2_SS: ISerializationSurrogate
	{
		//Serialize Vector2
		public void GetObjectData (System.Object obj, SerializationInfo info, StreamingContext context)
		{
			Vector2 v2 = (Vector2)obj;
			info.AddValue ("x", v2.x);
			info.AddValue ("y", v2.y);
		}
		//Deserialize Vector2
		public System.Object SetObjectData (System.Object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
		{
			Vector2 v2 = (Vector2)obj;

			v2.x = (float)info.GetValue ("x", typeof(float));
			v2.y = (float)info.GetValue ("y", typeof(float));

			obj = v2;
			return obj;
		}
	}

	class Vector3_SS: ISerializationSurrogate
	{
		//Serialize Vector3
		public void GetObjectData (System.Object obj, SerializationInfo info, StreamingContext context)
		{
			Vector3 v3 = (Vector3)obj;
			info.AddValue ("x", v3.x);
			info.AddValue ("y", v3.y);
			info.AddValue ("z", v3.z);
		}
		//Deserialize Vector3
		public System.Object SetObjectData (System.Object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
		{
			Vector3 v3 = (Vector3)obj;

			v3.x = (float)info.GetValue ("x", typeof(float));
			v3.y = (float)info.GetValue ("y", typeof(float));
			v3.z = (float)info.GetValue ("z", typeof(float));

			obj = v3;
			return obj;
		}
	}

	class Vector4_SS: ISerializationSurrogate
	{
		//Serialize Vector4
		public void GetObjectData (System.Object obj, SerializationInfo info, StreamingContext context)
		{
			Vector4 v4 = (Vector4)obj;
			info.AddValue ("x", v4.x);
			info.AddValue ("y", v4.y);
			info.AddValue ("z", v4.z);
			info.AddValue ("w", v4.w);
		}
		//Deserialize Vector4
		public System.Object SetObjectData (System.Object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
		{
			Vector4 v4 = (Vector4)obj;

			v4.x = (float)info.GetValue ("x", typeof(float));
			v4.y = (float)info.GetValue ("y", typeof(float));
			v4.z = (float)info.GetValue ("z", typeof(float));
			v4.w = (float)info.GetValue ("w", typeof(float));

			obj = v4;
			return obj;
		}

	}

	class Color_SS: ISerializationSurrogate
	{
		//Serialize Color
		public void GetObjectData (System.Object obj, SerializationInfo info, StreamingContext context)
		{
			Color color = (Color)obj;
			info.AddValue ("r", color.r);
			info.AddValue ("g", color.g);
			info.AddValue ("b", color.b);
			info.AddValue ("a", color.a);
		}
		//Deserialize Color
		public System.Object SetObjectData (System.Object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
		{
			Color color = (Color)obj;

			color.r = (float)info.GetValue ("r", typeof(float));
			color.g = (float)info.GetValue ("g", typeof(float));
			color.b = (float)info.GetValue ("b", typeof(float));
			color.a = (float)info.GetValue ("a", typeof(float));

			obj = color;
			return obj;
		}
	}

	class Quaternion_SS: ISerializationSurrogate
	{
		//Serialize Quaternion
		public void GetObjectData (System.Object obj, SerializationInfo info, StreamingContext context)
		{
			Quaternion qua = (Quaternion)obj;
			info.AddValue ("x", qua.x);
			info.AddValue ("y", qua.y);
			info.AddValue ("z", qua.z);
			info.AddValue ("w", qua.w);
		}
		//Deserialize Quaternion
		public System.Object SetObjectData (System.Object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
		{
			Quaternion qua = (Quaternion)obj;

			qua.x = (float)info.GetValue ("x", typeof(float));
			qua.y = (float)info.GetValue ("y", typeof(float));
			qua.z = (float)info.GetValue ("z", typeof(float));
			qua.w = (float)info.GetValue ("w", typeof(float));

			obj = qua;
			return obj;
		}
	}
}
  • Вопрос задан
  • 188 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
gdt
@gdt
Программист
Так сериализуйте не в FileStream а в MemoryStream, оттуда вытащить байты проще простого
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы