예제 #1
0
 protected void InvokeOnDeserializingCallbacks(T value, DeserializationContext context)
 {
     this.InvokeOnDeserializingCallbacks(ref value, context);
 }
예제 #2
0
 /// <summary>
 /// Deserializes a value of a given type from the given byte array in the given format, using the given list of Unity objects for external index reference resolution.
 /// </summary>
 /// <typeparam name="T">The type to deserialize.</typeparam>
 /// <param name="bytes">The bytes to deserialize from.</param>
 /// <param name="format">The format to read.</param>
 /// <param name="referencedUnityObjects">The list of Unity objects to use for external index reference resolution.</param>
 /// <param name="context">The context to use.</param>
 /// <returns>
 /// The deserialized value.
 /// </returns>
 public static T DeserializeValue <T>(byte[] bytes, DataFormat format, List <UnityEngine.Object> referencedUnityObjects, DeserializationContext context = null)
 {
     using (var stream = CachedMemoryStream.Claim(bytes))
     {
         return(DeserializeValue <T>(stream.Value.MemoryStream, format, referencedUnityObjects, context));
     }
 }
예제 #3
0
        private static IDataReader GetCachedReader(out IDisposable cache, DataFormat format, Stream stream, DeserializationContext context)
        {
            IDataReader reader;

            if (format == DataFormat.Binary)
            {
                var binaryCache = Cache <BinaryDataReader> .Claim();

                var binaryReader = binaryCache.Value;

                binaryReader.Stream  = stream;
                binaryReader.Context = context;
                binaryReader.PrepareNewSerializationSession();

                reader = binaryReader;
                cache  = binaryCache;
            }
            else if (format == DataFormat.JSON)
            {
                var jsonCache = Cache <JsonDataReader> .Claim();

                var jsonReader = jsonCache.Value;

                jsonReader.Stream  = stream;
                jsonReader.Context = context;
                jsonReader.PrepareNewSerializationSession();

                reader = jsonReader;
                cache  = jsonCache;
            }
            else if (format == DataFormat.Nodes)
            {
                throw new InvalidOperationException("Cannot automatically create a reader for the format '" + DataFormat.Nodes + "', because it does not use a stream.");
            }
            else
            {
                throw new NotImplementedException(format.ToString());
            }

            return(reader);
        }
예제 #4
0
        /// <summary>
        /// Deserializes a value of a given type from the given stream in the given format, using the given list of Unity objects for external index reference resolution.
        /// </summary>
        /// <typeparam name="T">The type to deserialize.</typeparam>
        /// <param name="stream">The stream to read from.</param>
        /// <param name="format">The format to read.</param>
        /// <param name="referencedUnityObjects">The list of Unity objects to use for external index reference resolution.</param>
        /// <param name="context">The context.</param>
        /// <returns>
        /// The deserialized value.
        /// </returns>
        public static T DeserializeValue <T>(Stream stream, DataFormat format, List <UnityEngine.Object> referencedUnityObjects, DeserializationContext context = null)
        {
            IDisposable cache;
            var         reader = GetCachedReader(out cache, format, stream, context);

            try
            {
                if (context != null)
                {
                    return(DeserializeValue <T>(reader, referencedUnityObjects));
                }
                else
                {
                    using (var con = Cache <DeserializationContext> .Claim())
                    {
                        reader.Context = con;
                        return(DeserializeValue <T>(reader, referencedUnityObjects));
                    }
                }
            }
            finally
            {
                cache.Dispose();
            }
        }
예제 #5
0
        /// <summary>
        /// Deserializes a value from the given stream in the given format, using the given list of Unity objects for external index reference resolution. This might fail with primitive values, as they don't come with type metadata.
        /// </summary>
        /// <param name="stream">The stream to read from.</param>
        /// <param name="format">The format to read.</param>
        /// <param name="referencedUnityObjects">The list of Unity objects to use for external index reference resolution.</param>
        /// <param name="context">The context.</param>
        /// <returns>
        /// The deserialized value.
        /// </returns>
        public static object DeserializeValueWeak(Stream stream, DataFormat format, List <UnityEngine.Object> referencedUnityObjects, DeserializationContext context = null)
        {
            var reader = GetCachedReader(stream, context, format);

            try
            {
                if (context != null)
                {
                    return(DeserializeValueWeak(reader, referencedUnityObjects));
                }
                else
                {
                    using (var con = Cache <DeserializationContext> .Claim())
                    {
                        reader.Context = con;
                        return(DeserializeValueWeak(reader, referencedUnityObjects));
                    }
                }
            }
            finally
            {
                FreeCachedReader(reader);
            }
        }