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--; }
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); }