예제 #1
0
        /// <summary>
        /// Write dictionary.
        /// </summary>
        /// <param name="writer">Portable writer.</param>
        /// <param name="vals">Values.</param>
        /// <returns>The same writer.</returns>
        protected static PortableWriterImpl WriteDictionary <T1, T2>(PortableWriterImpl writer,
                                                                     IDictionary <T1, T2> vals)
        {
            writer.WriteInt(vals.Count);

            foreach (KeyValuePair <T1, T2> pair in vals)
            {
                writer.Write(pair.Key);
                writer.Write(pair.Value);
            }

            return(writer);
        }
예제 #2
0
        internal bool Serialize(IPortableStream stream)
        {
            ClusterGroupImpl prj = _ignite.ClusterGroup;

            PortableWriterImpl writer = prj.Marshaller.StartMarshal(stream);

            try
            {
                writer.Write(this);

                return(true);
            }
            catch (Exception e)
            {
                writer.WriteString("Failed to marshal job [job=" + _job + ", errType=" + e.GetType().Name +
                                   ", errMsg=" + e.Message + ']');

                return(false);
            }
            finally
            {
                // 4. Process metadata.
                prj.FinishMarshal(writer);
            }
        }
예제 #3
0
        /// <summary>
        /// Write task to the writer.
        /// </summary>
        /// <param name="writer">Writer.</param>
        /// <param name="taskName">Task name.</param>
        /// <param name="taskArg">Task arg.</param>
        /// <param name="nodes">Nodes.</param>
        private void WriteTask(PortableWriterImpl writer, string taskName, object taskArg,
                               ICollection <IClusterNode> nodes)
        {
            writer.WriteString(taskName);
            writer.WriteBoolean(_keepPortable.Value);
            writer.Write(taskArg);

            WriteNodeIds(writer, nodes);
        }
        private void Marshal(PortableWriterImpl writer)
        {
            var pos = writer.Stream.Position;

            try
            {
                if (Error == null)
                {
                    writer.WriteByte((byte)Entry.State);

                    if (Entry.State == MutableCacheEntryState.ValueSet)
                    {
                        writer.Write(Entry.Value);
                    }

                    writer.Write(ProcessResult);
                }
                else
                {
                    writer.WriteByte((byte)MutableCacheEntryState.ErrPortable);
                    writer.Write(new PortableResultWrapper(Error));
                }
            }
            catch (Exception marshErr)
            {
                writer.Stream.Seek(pos, SeekOrigin.Begin);

                writer.WriteByte((byte)MutableCacheEntryState.ErrString);

                if (Error == null)
                {
                    writer.WriteString(string.Format(
                                           "CacheEntryProcessor completed with error, but result serialization failed [errType={0}, " +
                                           "err={1}, serializationErrMsg={2}]", marshErr.GetType().Name, marshErr, marshErr.Message));
                }
                else
                {
                    writer.WriteString(string.Format(
                                           "CacheEntryProcessor completed with error, and error serialization failed [errType={0}, " +
                                           "err={1}, serializationErrMsg={2}]", marshErr.GetType().Name, marshErr, marshErr.Message));
                }
            }
        }
예제 #5
0
        /// <summary>
        /// Write enumerable.
        /// </summary>
        /// <param name="writer">Portable writer.</param>
        /// <param name="vals">Values.</param>
        /// <param name="selector">A transform function to apply to each element.</param>
        /// <returns>The same writer for chaining.</returns>
        protected static PortableWriterImpl WriteEnumerable <T1, T2>(PortableWriterImpl writer,
                                                                     IEnumerable <T1> vals, Func <T1, T2> selector)
        {
            var col = vals as ICollection <T1>;

            if (col != null)
            {
                return(WriteCollection(writer, col, selector));
            }

            var stream = writer.Stream;

            var pos = stream.Position;

            stream.Seek(4, SeekOrigin.Current);

            var size = 0;

            if (selector == null)
            {
                foreach (var val in vals)
                {
                    writer.Write(val);

                    size++;
                }
            }
            else
            {
                foreach (var val in vals)
                {
                    writer.Write(selector(val));

                    size++;
                }
            }

            stream.WriteInt(pos, size);

            return(writer);
        }
예제 #6
0
        /// <summary>
        /// Write collection.
        /// </summary>
        /// <param name="writer">Portable writer.</param>
        /// <param name="vals">Values.</param>
        /// <param name="selector">A transform function to apply to each element.</param>
        /// <returns>The same writer for chaining.</returns>
        protected static PortableWriterImpl WriteCollection <T1, T2>(PortableWriterImpl writer,
                                                                     ICollection <T1> vals, Func <T1, T2> selector)
        {
            writer.WriteInt(vals.Count);

            if (selector == null)
            {
                foreach (var val in vals)
                {
                    writer.Write(val);
                }
            }
            else
            {
                foreach (var val in vals)
                {
                    writer.Write(selector(val));
                }
            }

            return(writer);
        }
예제 #7
0
        /// <summary>
        /// Write batch content.
        /// </summary>
        /// <param name="writer">Portable writer.</param>
        private void WriteTo(PortableWriterImpl writer)
        {
            writer.WriteInt(_size);

            object val;

            while (_queue.TryDequeue(out val))
            {
                // 1. Is it a collection?
                ICollection <KeyValuePair <TK, TV> > entries = val as ICollection <KeyValuePair <TK, TV> >;

                if (entries != null)
                {
                    foreach (KeyValuePair <TK, TV> item in entries)
                    {
                        writer.Write(item.Key);
                        writer.Write(item.Value);
                    }

                    continue;
                }

                // 2. Is it a single entry?
                DataStreamerEntry <TK, TV> entry = val as DataStreamerEntry <TK, TV>;

                if (entry != null)
                {
                    writer.Write(entry.Key);
                    writer.Write(entry.Value);

                    continue;
                }

                // 3. Is it remove merker?
                DataStreamerRemoveEntry <TK> rmvEntry = val as DataStreamerRemoveEntry <TK>;

                if (rmvEntry != null)
                {
                    writer.Write(rmvEntry.Key);
                    writer.Write <object>(null);
                }
            }
        }
        private void Marshal(PortableWriterImpl writer)
        {
            var pos = writer.Stream.Position;

            try
            {
                if (Error == null)
                {
                    writer.WriteByte((byte) Entry.State);

                    if (Entry.State == MutableCacheEntryState.ValueSet)
                        writer.Write(Entry.Value);

                    writer.Write(ProcessResult);
                }
                else
                {
                    writer.WriteByte((byte) MutableCacheEntryState.ErrPortable);
                    writer.Write(new PortableResultWrapper(Error));
                }
            }
            catch (Exception marshErr)
            {
                writer.Stream.Seek(pos, SeekOrigin.Begin);

                writer.WriteByte((byte) MutableCacheEntryState.ErrString);

                if (Error == null)
                {
                    writer.WriteString(string.Format(
                    "CacheEntryProcessor completed with error, but result serialization failed [errType={0}, " +
                    "err={1}, serializationErrMsg={2}]", marshErr.GetType().Name, marshErr, marshErr.Message));
                }
                else
                {
                    writer.WriteString(string.Format(
                    "CacheEntryProcessor completed with error, and error serialization failed [errType={0}, " +
                    "err={1}, serializationErrMsg={2}]", marshErr.GetType().Name, marshErr, marshErr.Message));
                }
            }
        }