public override object Deserialize(IJsonReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }

            if (reader.Token == JsonToken.Null)
            {
                return(null);
            }

            var value = new Vector4();

            reader.ReadArrayBegin();

            int idx = 0;

            while (reader.Token != JsonToken.EndOfArray)
            {
                value[idx++] = reader.ReadSingle();
            }

            reader.ReadArrayEnd(nextToken: false);

            return(value);
        }
        public override object Deserialize(IJsonReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }

            if (reader.Token == JsonToken.BeginArray)
            {
                var entry = new DictionaryEntry();
                reader.ReadArrayBegin();
                entry.Key   = reader.ReadValue(typeof(object));
                entry.Value = reader.ReadValue(typeof(object));
                reader.ReadArrayEnd(nextToken: false);
                return(entry);
            }
            else if (reader.Token == JsonToken.BeginObject)
            {
                var entry = new DictionaryEntry();
                reader.ReadObjectBegin();
                while (reader.Token != JsonToken.EndOfObject)
                {
                    var memberName = reader.ReadMember();
                    switch (memberName)
                    {
                    case KEY_MEMBER_NAME:
                        entry.Key = reader.ReadValue(typeof(object));
                        break;

                    case VALUE_MEMBER_NAME:
                        entry.Value = reader.ReadValue(typeof(object));
                        break;

                    case ObjectSerializer.TYPE_MEMBER_NAME:
                        reader.ReadValue(typeof(object));
                        break;

                    default:
                        throw new SerializationException(string.Format("Unknown member found '{0}' while '{1}' or '{2}' are expected.", memberName, KEY_MEMBER_NAME, VALUE_MEMBER_NAME));
                    }
                }
                reader.ReadObjectEnd(nextToken: false);
                return(entry);
            }
            else
            {
                throw JsonSerializationException.UnexpectedToken(reader, JsonToken.BeginObject, JsonToken.BeginArray);
            }
        }
        public override object Deserialize(IJsonReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }

            var container = new List <DictionaryEntry>();

            reader.Context.Hierarchy.Push(container);
            try
            {
                if (reader.Token == JsonToken.BeginArray)
                {
                    reader.ReadArrayBegin();
                    while (reader.Token != JsonToken.EndOfArray)
                    {
                        var entry = default(DictionaryEntry);

                        if (reader.Token == JsonToken.BeginArray)
                        {
                            reader.ReadArrayBegin();
                            try { entry.Key = reader.ReadValue(this.keyType); }
                            catch (Exception e) { throw new SerializationException(string.Format("Failed to read '{0}' key of dictionary: {1}\r\nMore detailed information in inner exception.", this.keyType.Name, e.Message), e); }
                            try { entry.Value = reader.ReadValue(this.valueType); }
                            catch (Exception e) { throw new SerializationException(string.Format("Failed to read '{0}' value for key '{1}' in dictionary: {2}\r\nMore detailed information in inner exception.", this.valueType.Name, entry.Key, e.Message), e); }
                            reader.ReadArrayEnd();
                        }
                        else
                        {
                            reader.ReadObjectBegin();
                            while (reader.Token != JsonToken.EndOfObject)
                            {
                                var memberName = reader.ReadMember();
                                switch (memberName)
                                {
                                case DictionaryEntrySerializer.KEY_MEMBER_NAME:
                                    try { entry.Key = reader.ReadValue(this.keyType); }
                                    catch (Exception e) { throw new SerializationException(string.Format("Failed to read '{0}' key of dictionary: {1}\r\nMore detailed information in inner exception.", this.keyType.Name, e.Message), e); }
                                    break;

                                case DictionaryEntrySerializer.VALUE_MEMBER_NAME:
                                    try { entry.Value = reader.ReadValue(this.valueType); }
                                    catch (Exception e) { throw new SerializationException(string.Format("Failed to read '{0}' value for key '{1}' in dictionary: {2}\r\nMore detailed information in inner exception.", this.valueType.Name, entry.Key ?? "<unknown>", e.Message), e); }
                                    break;

                                case ObjectSerializer.TYPE_MEMBER_NAME:
                                    reader.ReadValue(typeof(object));
                                    break;

                                default:
                                    throw new SerializationException(string.Format("Unknown member found '{0}' in dictionary entry while '{1}' or '{2}' are expected.", memberName, DictionaryEntrySerializer.KEY_MEMBER_NAME, DictionaryEntrySerializer.VALUE_MEMBER_NAME));
                                }
                            }
                            reader.ReadObjectEnd();
                        }
                        container.Add(entry);
                    }
                    reader.ReadArrayEnd(nextToken: false);
                }
                else if (reader.Token == JsonToken.BeginObject)
                {
                    reader.ReadObjectBegin();
                    while (reader.Token != JsonToken.EndOfObject)
                    {
                        var entry = default(DictionaryEntry);

                        try { entry.Key = reader.ReadValue(this.keyType); }
                        catch (Exception e) { throw new SerializationException(string.Format("Failed to read '{0}' key of dictionary: {1}\r\nMore detailed information in inner exception.", this.keyType.Name, e.Message), e); }

                        try { entry.Value = reader.ReadValue(this.valueType); }
                        catch (Exception e) { throw new SerializationException(string.Format("Failed to read '{0}' value for key '{1}' in dictionary: {2}\r\nMore detailed information in inner exception.", this.valueType.Name, entry.Key, e.Message), e); }

                        container.Add(entry);
                    }
                    reader.ReadObjectEnd(nextToken: false);
                }
                else
                {
                    throw JsonSerializationException.UnexpectedToken(reader, JsonToken.BeginObject, JsonToken.BeginArray);
                }

                var dictionary = (IDictionary)Activator.CreateInstance(this.instantiatedDictionaryType);
                foreach (var kv in container)
                {
                    var key   = kv.Key;
                    var value = kv.Value;

                    if (key.GetType() != this.keyType && this.keyType != typeof(object))
                    {
                        if (this.keyType.IsEnum)
                        {
                            key = Enum.Parse(this.keyType, Convert.ToString(key));
                        }
                        else
                        {
                            key = Convert.ChangeType(key, this.keyType);
                        }
                    }

                    if (dictionary.Contains(key))
                    {
                        dictionary.Remove(key);
                    }

                    dictionary.Add(key, value);
                }

                return(dictionary);
            }
            finally
            {
                reader.Context.Hierarchy.Pop();
            }
        }
Beispiel #4
0
        private (string, object[]) ReadData(SocketManager manager, IncomingPacket packet, IJsonReader reader)
        {
            Socket socket = manager.GetSocket(packet.Namespace);

            string       eventName    = packet.EventName;
            Subscription subscription = socket.GetSubscription(eventName);

            object[] args = null;

            switch (packet.SocketIOEvent)
            {
            case SocketIOEventTypes.Unknown:
                // TODO: Error?
                break;

            case SocketIOEventTypes.Connect:
                // No Data | Object
                args = ReadParameters(socket, subscription, reader);
                //SkipObject(reader);
                break;

            case SocketIOEventTypes.Disconnect:
                // No Data
                break;

            case SocketIOEventTypes.Error:
                // String | Object
                switch (reader.Token)
                {
                case JsonToken.StringLiteral:
                    args = new object[] { new Error(reader.ReadString()) };
                    break;

                case JsonToken.BeginObject:
                    args = ReadParameters(socket, subscription, reader);
                    if (subscription == null && args == null)
                    {
                        SkipObject(reader);
                    }
                    break;
                }
                break;

            case SocketIOEventTypes.Ack:
                eventName    = IncomingPacket.GenerateAcknowledgementNameFromId(packet.Id);
                subscription = socket.GetSubscription(eventName);

                reader.ReadArrayBegin();

                args = ReadParameters(socket, subscription, reader);

                reader.ReadArrayEnd();
                break;

            default:
                // Array
                reader.ReadArrayBegin();
                eventName = reader.ReadString();

                subscription = socket.GetSubscription(eventName);

                args = ReadParameters(socket, subscription, reader);

                reader.ReadArrayEnd();
                break;
            }

            return(eventName, args);
        }