/**
         * <summary>
         * Converts node bean to protocol message.</summary>
         *
         * <param name="node">Node bean to convert.</param>
         * <returns>Converted message.</returns>
         */
        private static GridClientNodeBean WrapNode(ProtoNodeBean node)
        {
            GridClientNodeBean bean = new GridClientNodeBean();

            bean.NodeId = WrapGuid(node.NodeId);

            bean.TcpPort      = node.TcpPort;
            bean.JettyPort    = node.JettyPort;
            bean.ConsistentId = WrapObject(node.ConsistentId);
            bean.ReplicaCount = node.ReplicaCount;

            bean.TcpAddresses.AddAll(node.TcpAddressList);
            bean.TcpHostNames.AddAll(node.TcpHostNameList);
            bean.JettyAddresses.AddAll(node.JettyAddressList);
            bean.JettyHostNames.AddAll(node.JettyHostNameList);

            if (node.HasCaches)
            {
                bean.Caches.AddAll <KeyValuePair <String, String> >(WrapMap <String, String>(node.Caches));
            }

            if (node.HasAttributes)
            {
                bean.Attributes.AddAll <KeyValuePair <String, Object> >(WrapMap <String, Object>(node.Attributes));
            }

            if (node.HasMetrics)
            {
                bean.Metrics.AddAll <KeyValuePair <String, Object> >(WrapMetrics(node.Metrics));
            }

            return(bean);
        }
        /**
         * <summary>
         * Converts node bean to protocol message.</summary>
         *
         * <param name="node">Node bean to convert.</param>
         * <returns>Converted message.</returns>
         */
        private static ProtoNodeBean WrapNode(GridClientNodeBean node)
        {
            ProtoNodeBean.Builder builder = ProtoNodeBean.CreateBuilder()
                                            .SetNodeId(WrapGuid(node.NodeId))
                                            .SetTcpPort(node.TcpPort)
                                            .SetJettyPort(node.JettyPort)
                                            .SetConsistentId(WrapObject(node.ConsistentId))
                                            .SetReplicaCount(node.ReplicaCount);

            if (node.TcpAddresses != null)
            {
                foreach (String addr in node.TcpAddresses)
                {
                    builder.AddTcpAddress(addr);
                }
            }

            if (node.TcpHostNames != null)
            {
                foreach (String addr in node.TcpHostNames)
                {
                    builder.AddTcpHostName(addr);
                }
            }

            if (node.JettyAddresses != null)
            {
                foreach (String addr in node.JettyAddresses)
                {
                    builder.AddJettyAddress(addr);
                }
            }

            if (node.JettyHostNames != null)
            {
                foreach (String addr in node.JettyHostNames)
                {
                    builder.AddJettyHostName(addr);
                }
            }

            if (node.Caches != null)
            {
                builder.SetCaches(WrapMap(node.Caches));
            }

            if (node.Attributes != null)
            {
                builder.SetAttributes(WrapMap(node.Attributes));
            }

            if (node.Metrics != null)
            {
                builder.SetMetrics(WrapMetrics(node.Metrics));
            }

            return(builder.Build());
        }
        /**
         * <summary>
         * Converts protocol object into object.</summary>
         *
         * <param name="val">Protocol message object to convert into value.</param>
         * <returns>Recovered object.</returns>
         */
        public static Object WrapObject(ObjectWrapper val)
        {
            byte[] bin = val.Binary.ToByteArray();

            // Primitives.

            switch (val.Type)
            {
            case ObjectWrapperType.NONE:
                return(null);

            case ObjectWrapperType.BOOL:
                Dbg.Assert(bin.Length == 1, "bin.Length == 1");

                return(bin[0] != 0);

            case ObjectWrapperType.BYTE:
                Dbg.Assert(bin.Length == 1, "bin.Length == 1");

                return(bin[0]);

            case ObjectWrapperType.SHORT:
                Dbg.Assert(bin.Length == 2, "bin.Length == 2");

                return(U.BytesToInt16(bin, 0));

            case ObjectWrapperType.INT32:
                Dbg.Assert(bin.Length == 4, "bin.Length == 4");

                return(U.BytesToInt32(bin, 0));

            case ObjectWrapperType.INT64:
                Dbg.Assert(bin.Length == 8, "bin.Length == 8");

                return(U.BytesToInt64(bin, 0));

            case ObjectWrapperType.FLOAT:
                Dbg.Assert(bin.Length == 4, "bin.Length == 4");

                return(U.BytesToSingle(bin, 0));

            case ObjectWrapperType.DOUBLE:
                Dbg.Assert(bin.Length == 8, "bin.Length == 8");

                return(U.BytesToDouble(bin, 0));

            case ObjectWrapperType.BYTES:
                return(bin);

            case ObjectWrapperType.UUID:
                return(WrapGuid(val.Binary));

            case ObjectWrapperType.STRING:
                return(val.Binary.ToStringUtf8());

            case ObjectWrapperType.COLLECTION:
                return(WrapCollection(Collection.ParseFrom(bin)));

            case ObjectWrapperType.MAP:
                return(WrapMap(Map.ParseFrom(bin)));

            case ObjectWrapperType.AUTH_REQUEST:
                return(WrapAuthRequest(ProtoRequest.ParseFrom(bin)));

            case ObjectWrapperType.CACHE_REQUEST:
                return(WrapCacheRequest(ProtoRequest.ParseFrom(bin)));

            case ObjectWrapperType.TASK_REQUEST:
                return(WrapTaskRequest(ProtoRequest.ParseFrom(bin)));

            case ObjectWrapperType.LOG_REQUEST:
                return(WrapLogRequest(ProtoRequest.ParseFrom(bin)));

            case ObjectWrapperType.TOPOLOGY_REQUEST:
                return(WrapTopologyRequest(ProtoRequest.ParseFrom(bin)));

            case ObjectWrapperType.RESPONSE:
                return(WrapResponse(ProtoResponse.ParseFrom(bin)));

            case ObjectWrapperType.NODE_BEAN:
                return(WrapNode(ProtoNodeBean.ParseFrom(bin)));

            case ObjectWrapperType.TASK_BEAN:
                return(WrapTaskResult(ProtoTaskBean.ParseFrom(bin)));

            default:
                throw new ArgumentException("Failed to deserialize object (object deserialization" +
                                            " of given type is not supported): " + val.Type);
            }
        }