using System; using System.Collections.Generic; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Text; using UnityEngine; namespace NeoSaveGames.Serialization { public class SafeDeserializer : INeoDeserializer { private Stream m_Stream = null; private Property m_LastNamedProperty = null; private BinaryFormatter m_BinaryFormatter = new BinaryFormatter(); private Stack m_ContextStack = new Stack(); public bool isDeserializing { get; private set; } public Context currentContext { get { return m_ContextStack.Peek(); } } public class Context { private Dictionary m_Properties = new Dictionary(); private Dictionary m_SubContexts = new Dictionary(); public int id { get; private set; } public SerializationContext contextType { get; private set; } public Dictionary properties { get { return m_Properties; } } public Dictionary subContexts { get { return m_SubContexts; } } public Context(SerializationContext t, int key) { id = key; contextType = t; } } public class Property { private List m_Children = new List(); public PropertyType propertyType { get; private set; } public PropertyFlags propertyFlags { get; private set; } public object data { get; private set; } public List children { get { return m_Children; } } public Property(PropertyType t, PropertyFlags f, object o) { propertyType = t; propertyFlags = f; data = o; } public bool isArray { get { return (propertyFlags & PropertyFlags.IsArray) != PropertyFlags.None; } } public bool isNullOrEmpty { get { return (propertyFlags & PropertyFlags.NullOrEmpty) != PropertyFlags.None; } } } public bool ReadFromStream(Stream stream) { if (stream != null) { isDeserializing = true; m_Stream = stream; var rootContext = new Context(SerializationContext.Root, 0); m_ContextStack.Push(rootContext); // Iterate through properties while (ReadElement()) ; var closingContext = m_ContextStack.Peek(); if (closingContext != rootContext) Debug.LogError("Unbalanced push/pop for serialization contexts. Deserialization did not end on the root context."); m_Stream = null; /* // Get the length of the data var totalLengthBytes = new byte[4]; stream.Read(totalLengthBytes, 0, 4); int totalLength = BitConverter.ToInt32(totalLengthBytes, 0); // Read data var bytes = new byte[totalLength]; int totalRead = stream.Read(bytes, 0, totalLength); if (totalRead != totalLength) { Debug.LogError(string.Format("Save data length mismatch. Could not read from stream. Expected: {0}, Read {1}", totalLength, totalRead)); return false; } m_Stream = new MemoryStream(bytes, false); Debug.Log("Total bytes: " + totalLength); */ return true; } else return false; } public void BeginDeserialization() { } bool ReadElement() { var pType = (PropertyType)m_BinaryFormatter.Deserialize(m_Stream); if (pType == PropertyType.EndOfData) return false; switch (pType) { case PropertyType.PushContext: { // Read the relevant context data var contextType = (SerializationContext)m_BinaryFormatter.Deserialize(m_Stream); var key = (int)m_BinaryFormatter.Deserialize(m_Stream); // Create the new context var newContext = new Context(contextType, key); // Add new context to old var currentContext = m_ContextStack.Peek(); if (currentContext.subContexts.ContainsKey(key)) Debug.LogError("Context key collision: " + key); else currentContext.subContexts.Add(key, newContext); // Push new context m_ContextStack.Push(newContext); } break; case PropertyType.PopContext: { var contextType = (SerializationContext)m_BinaryFormatter.Deserialize(m_Stream); var popped = m_ContextStack.Pop(); if (popped.contextType != contextType) Debug.LogError("Popped serialization context does not match active context. Your save game might be messed up."); } break; default: { // Get property flags var flags = (PropertyFlags)m_BinaryFormatter.Deserialize(m_Stream); // Check if array bool isUnnamed = (flags & PropertyFlags.Unnammed) != PropertyFlags.None; // Add the property (to the context or parent depending if named) if (isUnnamed) { if (m_LastNamedProperty == null) Debug.LogError("Attempting to read child property when no parent set"); else { // Add as a child property of the last named property if ((flags & PropertyFlags.NullOrEmpty) != PropertyFlags.None) m_LastNamedProperty.children.Add(new Property(pType, flags, null)); else m_LastNamedProperty.children.Add(new Property(pType, flags, m_BinaryFormatter.Deserialize(m_Stream))); } } else { // Get the hash int hash = (int)m_BinaryFormatter.Deserialize(m_Stream); // Create the property if ((flags & PropertyFlags.NullOrEmpty) != PropertyFlags.None) m_LastNamedProperty = new Property(pType, flags, null); else m_LastNamedProperty = new Property(pType, flags, m_BinaryFormatter.Deserialize(m_Stream)); // Add to dictionary var context = m_ContextStack.Peek(); if (context.properties.ContainsKey(hash)) Debug.LogError(string.Format("Key collision: {0}, type: {1}, in context: {2}", hash, pType, context.id)); else context.properties.Add(hash, m_LastNamedProperty); } } break; } return true; } public void EndDeserialization() { m_LastNamedProperty = null; isDeserializing = false; m_ContextStack.Clear(); } public bool PushContext(SerializationContext context, int id) { Context c; if (m_ContextStack.Peek().subContexts.TryGetValue(id, out c)) { m_ContextStack.Push(c); return true; } else { return false; } } public void PopContext(SerializationContext context, int id) { var activeContext = m_ContextStack.Pop().contextType; if (activeContext != context) Debug.LogError(string.Format("Popped serialization context does not match active context. Popped: {0}, Active: {1}", context, activeContext)); } #region READ HELPERS bool TryFetchProperty(int hash, PropertyType t, bool isArray) { if (m_ContextStack.Peek().properties.TryGetValue(hash, out m_LastNamedProperty) && m_LastNamedProperty.propertyType == t && m_LastNamedProperty.isArray == isArray) return true; else return false; } void ReadList(List output) { output.Clear(); if (!m_LastNamedProperty.isNullOrEmpty && m_LastNamedProperty.data != null) output.AddRange((List)m_LastNamedProperty.data); } T[] ReadArray() { if (m_LastNamedProperty.isNullOrEmpty || m_LastNamedProperty.data == null) { return new T[0]; } else { // Get the serialized collection var collection = (List)m_LastNamedProperty.data; return collection.ToArray(); } } List ReadIntermediates() { if (m_LastNamedProperty.isNullOrEmpty || m_LastNamedProperty.data == null) return null; else return (List)m_LastNamedProperty.data; } #endregion #region SINGLE VALUE READERS public bool TryReadValue(int hash, out bool output, bool defaultValue) { if (TryFetchProperty(hash, PropertyType.Bool, false)) { output = (bool)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out byte output, byte defaultValue) { if (TryFetchProperty(hash, PropertyType.Byte, false)) { output = (byte)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out sbyte output, sbyte defaultValue) { if (TryFetchProperty(hash, PropertyType.SignedByte, false)) { output = (sbyte)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out char output, char defaultValue) { if (TryFetchProperty(hash, PropertyType.Char, false)) { output = (char)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out short output, short defaultValue) { if (TryFetchProperty(hash, PropertyType.Short, false)) { output = (short)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out ushort output, ushort defaultValue) { if (TryFetchProperty(hash, PropertyType.UnsignedShort, false)) { output = (ushort)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out int output, int defaultValue) { if (TryFetchProperty(hash, PropertyType.Int, false)) { output = (int)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out uint output, uint defaultValue) { if (TryFetchProperty(hash, PropertyType.UnsignedInt, false)) { output = (uint)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out long output, long defaultValue) { if (TryFetchProperty(hash, PropertyType.Long, false)) { output = (long)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out ulong output, ulong defaultValue) { if (TryFetchProperty(hash, PropertyType.UnsignedLong, false)) { output = (ulong)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out float output, float defaultValue) { if (TryFetchProperty(hash, PropertyType.Float, false)) { output = (float)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out double output, double defaultValue) { if (TryFetchProperty(hash, PropertyType.Double, false)) { output = (double)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out string output, string defaultValue) { if (TryFetchProperty(hash, PropertyType.String, false)) { output = (string)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out Vector2 output, Vector2 defaultValue) { if (TryFetchProperty(hash, PropertyType.Vector2, false)) { output = (IntermediateVector2)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out Vector3 output, Vector3 defaultValue) { if (TryFetchProperty(hash, PropertyType.Vector3, false)) { output = (IntermediateVector3)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out Vector4 output, Vector4 defaultValue) { if (TryFetchProperty(hash, PropertyType.Vector4, false)) { output = (IntermediateVector4)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out Vector2Int output, Vector2Int defaultValue) { if (TryFetchProperty(hash, PropertyType.Vector2Int, false)) { output = (IntermediateVector2Int)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out Vector3Int output, Vector3Int defaultValue) { if (TryFetchProperty(hash, PropertyType.Vector3Int, false)) { output = (IntermediateVector3Int)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out Quaternion output, Quaternion defaultValue) { if (TryFetchProperty(hash, PropertyType.Quaternion, false)) { output = (IntermediateVector4)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out Color output, Color defaultValue) { if (TryFetchProperty(hash, PropertyType.Color, false)) { output = (IntermediateVector4)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out Color32 output, Color32 defaultValue) { if (TryFetchProperty(hash, PropertyType.Color32, false)) { output = (IntermediateColor32)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } public bool TryReadValue(int hash, out Guid output) { if (TryFetchProperty(hash, PropertyType.Guid, false)) { output = (Guid)m_LastNamedProperty.data; return true; } else { output = new Guid(); return false; } } public bool TryReadValue(int hash, out DateTime output, DateTime defaultValue) { if (TryFetchProperty(hash, PropertyType.DateTime, false)) { output = (DateTime)m_LastNamedProperty.data; return true; } else { output = defaultValue; return false; } } #endregion #region ARRAY READERS public bool TryReadValues(int hash, out bool[] output, bool[] defaultValues) { if (TryFetchProperty(hash, PropertyType.Bool, true)) { output = ReadArray(); return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out byte[] output, byte[] defaultValues) { if (TryFetchProperty(hash, PropertyType.Byte, true)) { output = ReadArray(); return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out sbyte[] output, sbyte[] defaultValues) { if (TryFetchProperty(hash, PropertyType.SignedByte, true)) { output = ReadArray(); return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out char[] output, char[] defaultValues) { if (TryFetchProperty(hash, PropertyType.Char, true)) { output = ReadArray(); return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out short[] output, short[] defaultValues) { if (TryFetchProperty(hash, PropertyType.Short, true)) { output = ReadArray(); return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out ushort[] output, ushort[] defaultValues) { if (TryFetchProperty(hash, PropertyType.UnsignedShort, true)) { output = ReadArray(); return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out int[] output, int[] defaultValues) { if (TryFetchProperty(hash, PropertyType.Int, true)) { output = ReadArray(); return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out uint[] output, uint[] defaultValues) { if (TryFetchProperty(hash, PropertyType.UnsignedInt, true)) { output = ReadArray(); return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out long[] output, long[] defaultValues) { if (TryFetchProperty(hash, PropertyType.Long, true)) { output = ReadArray(); return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out ulong[] output, ulong[] defaultValues) { if (TryFetchProperty(hash, PropertyType.UnsignedLong, true)) { output = ReadArray(); return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out float[] output, float[] defaultValues) { if (TryFetchProperty(hash, PropertyType.Float, true)) { output = ReadArray(); return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out double[] output, double[] defaultValues) { if (TryFetchProperty(hash, PropertyType.Double, true)) { output = ReadArray(); return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out string[] output, string[] defaultValues) { if (TryFetchProperty(hash, PropertyType.String, true)) { output = ReadArray(); return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out Vector2[] output, Vector2[] defaultValues) { if (TryFetchProperty(hash, PropertyType.Vector2, true)) { var intermediates = ReadIntermediates(); if (intermediates == null) output = new Vector2[0]; else { // Allocate output = new Vector2[intermediates.Count]; // Transfer across int i = 0; foreach (var intermediate in intermediates) output[i++] = intermediate; } return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out Vector3[] output, Vector3[] defaultValues) { if (TryFetchProperty(hash, PropertyType.Vector3, true)) { var intermediates = ReadIntermediates(); if (intermediates == null) output = new Vector3[0]; else { // Allocate output = new Vector3[intermediates.Count]; // Transfer across int i = 0; foreach (var intermediate in intermediates) output[i++] = intermediate; } return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out Vector4[] output, Vector4[] defaultValues) { if (TryFetchProperty(hash, PropertyType.Vector4, true)) { var intermediates = ReadIntermediates(); if (intermediates == null) output = new Vector4[0]; else { // Allocate output = new Vector4[intermediates.Count]; // Transfer across int i = 0; foreach (var intermediate in intermediates) output[i++] = intermediate; } return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out Vector2Int[] output, Vector2Int[] defaultValues) { if (TryFetchProperty(hash, PropertyType.Vector2Int, true)) { var intermediates = ReadIntermediates(); if (intermediates == null) output = new Vector2Int[0]; else { // Allocate output = new Vector2Int[intermediates.Count]; // Transfer across int i = 0; foreach (var intermediate in intermediates) output[i++] = intermediate; } return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out Vector3Int[] output, Vector3Int[] defaultValues) { if (TryFetchProperty(hash, PropertyType.Vector3Int, true)) { var intermediates = ReadIntermediates(); if (intermediates == null) output = new Vector3Int[0]; else { // Allocate output = new Vector3Int[intermediates.Count]; // Transfer across int i = 0; foreach (var intermediate in intermediates) output[i++] = intermediate; } return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out Quaternion[] output, Quaternion[] defaultValues) { if (TryFetchProperty(hash, PropertyType.Quaternion, true)) { var intermediates = ReadIntermediates(); if (intermediates == null) output = new Quaternion[0]; else { // Allocate output = new Quaternion[intermediates.Count]; // Transfer across int i = 0; foreach (var intermediate in intermediates) output[i++] = intermediate; } return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out Color[] output, Color[] defaultValues) { if (TryFetchProperty(hash, PropertyType.Color, true)) { var intermediates = ReadIntermediates(); if (intermediates == null) output = new Color[0]; else { // Allocate output = new Color[intermediates.Count]; // Transfer across int i = 0; foreach (var intermediate in intermediates) output[i++] = intermediate; } return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out Color32[] output, Color32[] defaultValues) { if (TryFetchProperty(hash, PropertyType.Color32, true)) { var intermediates = ReadIntermediates(); if (intermediates == null) output = new Color32[0]; else { // Allocate output = new Color32[intermediates.Count]; // Transfer across int i = 0; foreach (var intermediate in intermediates) output[i++] = intermediate; } return true; } else { output = defaultValues; return false; } } public bool TryReadValues(int hash, out Guid[] output) { if (TryFetchProperty(hash, PropertyType.Guid, true)) { output = ReadArray(); return true; } else { output = new Guid[0]; return false; } } #endregion #region LIST READERS public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.Bool, true)) { ReadList(output); return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.Byte, true)) { ReadList(output); return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.SignedByte, true)) { ReadList(output); return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.Char, true)) { ReadList(output); return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.Short, true)) { ReadList(output); return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.UnsignedShort, true)) { ReadList(output); return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.Int, true)) { ReadList(output); return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.UnsignedInt, true)) { ReadList(output); return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.Long, true)) { ReadList(output); return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.UnsignedLong, true)) { ReadList(output); return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.Float, true)) { ReadList(output); return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.Double, true)) { ReadList(output); return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.String, true)) { ReadList(output); return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.Vector2, true)) { output.Clear(); var intermediates = ReadIntermediates(); if (intermediates != null) { foreach (var intermediate in intermediates) output.Add(intermediate); } return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.Vector3, true)) { output.Clear(); var intermediates = ReadIntermediates(); if (intermediates != null) { foreach (var intermediate in intermediates) output.Add(intermediate); } return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.Vector4, true)) { output.Clear(); var intermediates = ReadIntermediates(); if (intermediates != null) { foreach (var intermediate in intermediates) output.Add(intermediate); } return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.Vector2Int, true)) { output.Clear(); var intermediates = ReadIntermediates(); if (intermediates != null) { foreach (var intermediate in intermediates) output.Add(intermediate); } return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.Vector3Int, true)) { output.Clear(); var intermediates = ReadIntermediates(); if (intermediates != null) { foreach (var intermediate in intermediates) output.Add(intermediate); } return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.Quaternion, true)) { output.Clear(); var intermediates = ReadIntermediates(); if (intermediates != null) { foreach (var intermediate in intermediates) output.Add(intermediate); } return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.Color, true)) { output.Clear(); var intermediates = ReadIntermediates(); if (intermediates != null) { foreach (var intermediate in intermediates) output.Add(intermediate); } return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.Color32, true)) { output.Clear(); var intermediates = ReadIntermediates(); if (intermediates != null) { foreach (var intermediate in intermediates) output.Add(intermediate); } return true; } else return false; } public bool TryReadValues(int hash, List output) { if (TryFetchProperty(hash, PropertyType.Guid, true)) { ReadList(output); return true; } else return false; } #endregion #region SERIALIZABLES public bool TryReadSerializable(int hash, out T output, T defaultValue) { if (TryFetchProperty(hash, PropertyType.Serializable, false)) { if (m_LastNamedProperty.isNullOrEmpty) output = default(T); else output = (T)m_BinaryFormatter.Deserialize(m_Stream); return true; } else { output = defaultValue; return false; } } public bool TryReadSerializables(int hash, out T[] output, T[] defaultValues) { if (TryFetchProperty(hash, PropertyType.Serializable, true)) { if (m_LastNamedProperty.isNullOrEmpty) output = new T[0]; else { var collection = (ICollection < T >)m_BinaryFormatter.Deserialize(m_Stream); output = new T[collection.Count]; collection.CopyTo(output, 0); } return true; } else { output = defaultValues; return false; } } public bool TryReadSerializables(int hash, List output) { if (TryFetchProperty(hash, PropertyType.Serializable, true)) { output.Clear(); if (!m_LastNamedProperty.isNullOrEmpty) output.AddRange((ICollection)m_BinaryFormatter.Deserialize(m_Stream)); return true; } else return false; } #endregion #region REFERENCES public bool TryReadComponentReference(int hash, out T output, NeoSerializedGameObject pathFrom) where T : class { return NeoSerializationUtilities.TryReadComponentReference(this, out output, pathFrom, hash); } public bool TryReadTransformReference(int hash, out Transform output, NeoSerializedGameObject pathFrom) { return NeoSerializationUtilities.TryReadTransformReference(this, out output, pathFrom, hash); } public bool TryReadGameObjectReference(int hash, out GameObject output, NeoSerializedGameObject pathFrom) { return NeoSerializationUtilities.TryReadGameObjectReference(this, out output, pathFrom, hash); } public bool TryReadNeoSerializedGameObjectReference(int hash, out NeoSerializedGameObject output, NeoSerializedGameObject pathFrom) { return NeoSerializationUtilities.TryReadNeoSerializedGameObjectReference(this, out output, pathFrom, hash); } #endregion #region STRING KEYS public bool TryReadValue(string key, out bool output, bool defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out byte output, byte defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out sbyte output, sbyte defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out char output, char defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out short output, short defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out ushort output, ushort defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out int output, int defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out uint output, uint defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out long output, long defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out ulong output, ulong defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out float output, float defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out double output, double defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out Vector2 output, Vector2 defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out Vector3 output, Vector3 defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out Vector4 output, Vector4 defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out Vector2Int output, Vector2Int defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out Vector3Int output, Vector3Int defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out Quaternion output, Quaternion defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out Color output, Color defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out Color32 output, Color32 defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out Guid output) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output); } public bool TryReadValue(string key, out DateTime output, DateTime defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValue(string key, out string output, string defaultValue) { return TryReadValue(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadValues(string key, out bool[] output, bool[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out byte[] output, byte[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out sbyte[] output, sbyte[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out char[] output, char[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out short[] output, short[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out ushort[] output, ushort[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out int[] output, int[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out uint[] output, uint[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out long[] output, long[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out ulong[] output, ulong[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out float[] output, float[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out double[] output, double[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out string[] output, string[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out Vector2[] output, Vector2[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out Vector3[] output, Vector3[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out Vector4[] output, Vector4[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out Vector2Int[] output, Vector2Int[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out Vector3Int[] output, Vector3Int[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out Quaternion[] output, Quaternion[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out Color[] output, Color[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out Color32[] output, Color32[] defaultValues) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadValues(string key, out Guid[] output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), out output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadValues(string key, List output) { return TryReadValues(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadSerializable(string key, out T output, T defaultValue) { return TryReadSerializable(NeoSerializationUtilities.StringToHash(key), out output, defaultValue); } public bool TryReadSerializables(string key, out T[] output, T[] defaultValues) { return TryReadSerializables(NeoSerializationUtilities.StringToHash(key), out output, defaultValues); } public bool TryReadSerializables(string key, List output) { return TryReadSerializables(NeoSerializationUtilities.StringToHash(key), output); } public bool TryReadComponentReference(string key, out T output, NeoSerializedGameObject pathFrom) where T : class { return TryReadComponentReference(NeoSerializationUtilities.StringToHash(key), out output, pathFrom); } public bool TryReadTransformReference(string key, out Transform output, NeoSerializedGameObject pathFrom) { return TryReadTransformReference(NeoSerializationUtilities.StringToHash(key), out output, pathFrom); } public bool TryReadGameObjectReference(string key, out GameObject output, NeoSerializedGameObject pathFrom) { return TryReadGameObjectReference(NeoSerializationUtilities.StringToHash(key), out output, pathFrom); } public bool TryReadNeoSerializedGameObjectReference(string key, out NeoSerializedGameObject output, NeoSerializedGameObject pathFrom) { return TryReadNeoSerializedGameObjectReference(NeoSerializationUtilities.StringToHash(key), out output, pathFrom); } #endregion } }