Example #1
0
        /// <summary>
        /// Serialize objects to a byte array synchronously, using user defined logic.
        /// </summary>
        /// <param name="serialization_callback">The callback used to serialize the data once the context is set.</param>
        /// <param name="default_buffer_size">The default size to use for serialization buffer.</param>
        /// <returns>The serialized data.</returns>
        public byte[] Serialize(SerializationCallback serialization_callback, uint default_buffer_size = defaultSerializationBufferSize)
        {
            byte[] result = null;

            Buffer buffer = null;

            try
            {
                buffer = GetBuffer(default_buffer_size);

                uint written = serialization_callback(this, ref buffer);

                result = new byte[written];

                Array.Copy(buffer.Data, result, written);
            }
            catch (Exception e)
            {
                throw new SerializationException("An error occured during serialization.", e);
            }
            finally
            {
                if (buffer != null)
                {
                    buffer.Dispose();
                }
            }

            return(result);
        }
Example #2
0
        /// <summary>
        /// Serialize an object to a byte array asynchronously, using user defined logic.
        /// </summary>
        /// <param name="serialization_callback">The callback used to serialize the data once the context is set.</param>
        /// <param name="callback">A callback called once the data is serialized to get the result byte array and serialized size.</param>
        /// <param name="progress">A callback to get progress notifications.</param>
        /// <param name="default_buffer_size">The default size to use for serialization buffer.</param>
        /// <returns>An enumerator to wait for the serialization completion.</returns>
        public IEnumerator Serialize(SerializationCallback serialization_callback, Action <Buffer> callback, Action <float> progress = null, uint default_buffer_size = defaultSerializationBufferSize)
        {
            Buffer buffer = null;

            DateTime time = DateTime.Now + progressRefresRate;
            float    progress_percentage = 0f;

            buffer = GetBuffer(default_buffer_size, p => progress_percentage = p);

            Task <uint> result = Task.Run(() => serialization_callback(this, ref buffer));

            while (!result.IsCompleted)
            {
                if (progress != null && DateTime.Now >= time)
                {
                    progress(progress_percentage);

                    time = DateTime.Now + progressRefresRate;
                }

                yield return(null);
            }

            if (result.Exception != null)
            {
                throw new SerializationException("An error occured during serialization.", result.Exception);
            }

            buffer.Size = result.Result;

            callback?.Invoke(buffer);
        }
Example #3
0
 /// <summary>
 /// 移除一个序列化/反序列化事件的回调
 /// </summary>
 /// <typeparam name="T">序列化/反序列化对象的类型</typeparam>
 /// <param name="type">回调的类型</param>
 /// <param name="callback">回调委托</param>
 public static void RemoveCallback <T>(SerializationCallbackType type, SerializationCallback <T> callback)
 {
     if (type == SerializationCallbackType.OnBeforeSerialization)
     {
         InternalTypeCache <T> .OnBeforeSerializationCallbacks -= callback;
     }
     else
     {
         InternalTypeCache <T> .OnAfterDeserializationCallbacks -= callback;
     }
 }
Example #4
0
        /// <summary>
        /// Serialize objects to a buffer synchronously, using user defined logic.
        /// </summary>
        /// <remarks>Serialized data size is store in buffer Size property. Returned buffer must be disposed after use.</remarks>
        /// <param name="serialization_callback">The callback used to serialize the data once the context is set.</param>
        /// <param name="default_buffer_size">The default size to use for serialization buffer.</param>
        /// <returns>The serialized data.</returns>
        public Buffer Serialize(SerializationCallback serialization_callback, uint default_buffer_size = defaultSerializationBufferSize)
        {
            Buffer buffer = null;

            try
            {
                buffer = GetBuffer(default_buffer_size);

                buffer.Size = serialization_callback(this, ref buffer);
            }
            catch (Exception e)
            {
                throw new SerializationException("An error occured during serialization.", e);
            }

            return(buffer);
        }
 public ShouldSerializeContractResolver(Predicate <object> shouldSerialize)
     : base()
 {
     this.shouldSerialize       = shouldSerialize;
     this.serializationCallback = (o, context) =>
     {
         if (shouldSerialize != null && !this.shouldSerialize(o))
         {
             throw new JsonSkipObjectException();
         }
     };
     this.onErrorCallback = (o, context, errorContext) =>
     {
         if (errorContext.Error is JsonSkipObjectException)
         {
             errorContext.Handled = true;
         }
     };
 }
Example #6
0
 protected ISupportInitializeContractResolver()
     : base()
 {
     onDeserializing = (o, context) =>
     {
         var init = o as ISupportInitialize;
         if (init != null)
         {
             init.BeginInit();
         }
     };
     onDeserialized = (o, context) =>
     {
         var init = o as ISupportInitialize;
         if (init != null)
         {
             init.EndInit();
         }
     };
 }
Example #7
0
        /// <summary>
        /// Serialize an object to a file asynchronously, using user defined logic.
        /// </summary>
        /// <param name="serialization_callback">The callback used to serialize the data once the context is set.</param>
        /// <param name="filename">The name of the file where to save the serialized data.</param>
        /// <param name="callback">A callback called once the data is serialized to know if the serialization was a success.</param>
        /// <param name="progress">A callback to get progress notifications.</param>
        /// <param name="default_buffer_size">The default size to use for serialization buffer.</param>
        /// <returns>An enumerator to wait for the serialization completion.</returns>
        public IEnumerator Serialize(SerializationCallback serialization_callback, string filename, Action <bool> callback = null, Action <float> progress = null, uint default_buffer_size = defaultSerializationBufferSize)
        {
            return(Serialize(serialization_callback, (b, s) =>
            {
                bool success = false;

                if (b != null && b.Length > 0)
                {
                    using (System.IO.FileStream fs = System.IO.File.Open(filename, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.None))
                    {
                        fs.Write(b, 0, (int)s);
                    }

                    success = true;
                }

                if (callback != null)
                {
                    callback(success);
                }
            }, progress, default_buffer_size));
        }
Example #8
0
 /// <summary>
 /// Serialize an object to a file asynchronously, using user defined logic.
 /// </summary>
 /// <param name="serialization_callback">The callback used to serialize the data once the context is set.</param>
 /// <param name="filename">The name of the file where to save the serialized data.</param>
 /// <param name="callback">A callback called once the data is serialized to know if the serialization was a success.</param>
 /// <param name="progress">A callback to get progress notifications.</param>
 /// <param name="default_buffer_size">The default size to use for serialization buffer.</param>
 /// <returns>An enumerator to wait for the serialization completion.</returns>
 public IEnumerator Serialize(SerializationCallback serialization_callback, string filename, Action <bool> callback = null, Action <float> progress = null, uint default_buffer_size = defaultSerializationBufferSize)
 {
     return(Serialize(serialization_callback, b => WriteToFile(b, filename, callback), progress, default_buffer_size));
 }
Example #9
0
 /// <summary>
 /// 移除序列化和反序列化事件的回调
 /// </summary>
 /// <typeparam name="T">序列化/反序列化对象的类型</typeparam>
 /// <param name="onBeforeSerialization">在序列化前调用的回调</param>
 /// <param name="onAfterDeserialization">在反序列化后调用的回调</param>
 public static void RemoveCallback <T>(SerializationCallback <T> onBeforeSerialization, SerializationCallback <T> onAfterDeserialization)
 {
     InternalTypeCache <T> .OnBeforeSerializationCallbacks  -= onBeforeSerialization;
     InternalTypeCache <T> .OnAfterDeserializationCallbacks -= onAfterDeserialization;
 }