예제 #1
0
        private void SerializeValue(JsonWriter writer, object value)
        {
            //JsonConverter converter;
            _currentRecursionCounter++;
            if (RecursionLimit > 0 && _currentRecursionCounter > RecursionLimit) {
                throw new ArgumentException ("RecursionLimit exceeded.");
            }

            if (value == null) {
                writer.WriteNull ();
            } else {
                JavaScriptConverter jsconverter = _context.GetConverter (value.GetType ());
                if (jsconverter != null) {
                    value = jsconverter.Serialize (value, _context);
                    if (value == null) {
                        writer.WriteNull ();
                        return;
                    }
                }

                Type valueType = value.GetType ();
                switch (Type.GetTypeCode (valueType)) {
                case TypeCode.String:
                    writer.WriteValue ((string)value);
                    break;
                case TypeCode.Char:
                    writer.WriteValue ((char)value);
                    break;
                case TypeCode.Boolean:
                    writer.WriteValue ((bool)value);
                    break;
                case TypeCode.SByte:
                    writer.WriteValue ((sbyte)value);
                    break;
                case TypeCode.Int16:
                    writer.WriteValue ((short)value);
                    break;
                case TypeCode.UInt16:
                    writer.WriteValue ((ushort)value);
                    break;
                case TypeCode.Int32:
                    writer.WriteValue ((int)value);
                    break;
                case TypeCode.Byte:
                    writer.WriteValue ((byte)value);
                    break;
                case TypeCode.UInt32:
                    writer.WriteValue ((uint)value);
                    break;
                case TypeCode.Int64:
                    writer.WriteValue ((long)value);
                    break;
                case TypeCode.UInt64:
                    writer.WriteValue ((ulong)value);
                    break;
                case TypeCode.Single:
                    writer.WriteValue ((float)value);
                    break;
                case TypeCode.Double:
                    writer.WriteValue ((double)value);
                    break;
                case TypeCode.DateTime:
                    writer.WriteValue ((DateTime)value);
                    break;
                case TypeCode.Decimal:
                    writer.WriteValue ((decimal)value);
                    break;
                default:

                    ThrowOnReferenceLoop (writer, value);
                    writer.SerializeStack.Push (value);
                    try {
                        Type genDictType;
                        if (value is IDictionary)
                            SerializeDictionary (writer, (IDictionary)value);
                        else if (value is IDictionary<string, object>)
                            SerializeDictionary (writer, (IDictionary<string, object>)value, null);
                        else if ((genDictType = ReflectionUtils.GetGenericDictionary (valueType)) != null)
                            SerializeDictionary (writer, new GenericDictionaryLazyDictionary (value, genDictType), null);
                        else if (value is IEnumerable) {
                            SerializeEnumerable (writer, (IEnumerable)value);
                        } else {
                            SerializeCustomObject (writer, value, valueType);
                        }
                    } finally {

                        object x = writer.SerializeStack.Pop ();
                        if (x != value)
                            throw new InvalidOperationException ("Serialization stack is corrupted");
                    }

                    break;
                }
            }

            _currentRecursionCounter--;
        }
예제 #2
0
        private void SerializeCustomObject(JsonWriter writer, object value, Type valueType)
        {
            if (value is Uri) {
                Uri uri = value as Uri;
                writer.WriteValue (uri.GetComponents (UriComponents.AbsoluteUri, UriFormat.UriEscaped));
                return;
            }
            if (valueType == typeof(Guid)) {
                writer.WriteValue (((Guid)value).ToString ());
                return;
            }

            string typeID = null;
            if (_typeResolver != null) {
                typeID = _typeResolver.ResolveTypeId (valueType);
            }

            SerializeDictionary (writer, new SerializerLazyDictionary (value), typeID);
        }