public void Serialize(SLJsonWriter writer) { if (writer == null) { throw new ArgumentNullException("writer"); } switch (NodeType) { case SLJsonNodeType.Missing: case SLJsonNodeType.Null: writer.WriteValueNull(); break; case SLJsonNodeType.Array: SerializeArray(writer); break; case SLJsonNodeType.Object: SerializeObject(writer); break; case SLJsonNodeType.Boolean: writer.WriteValue(AsBoolean); break; case SLJsonNodeType.Number: writer.WriteValue(AsDouble); break; case SLJsonNodeType.String: writer.WriteValue(AsString); break; default: throw new NotImplementedException(); } }
void SerializeArray(SLJsonWriter writer, Type type, object array, bool asObject) { if (type.IsArray && type.GetArrayRank() != 1) { throw new NotSupportedException("Multi-dimensional arrays are not supported"); } if (!typeof(IEnumerable).GetTypeInfo().IsAssignableFrom(type.GetTypeInfo())) { throw new NotSupportedException("Type " + type.FullName + " does not implement IEnumerable"); } if (array == null) { writer.WriteValue(null); return; } writer.BeginArray(); var helper = (IEnumerable)array; foreach (object value in helper) { if (asObject) { SerializeObject(writer, value); } else { SerializeValue(writer, type, value); } } writer.EndArray(); }
void SerializeValue(SLJsonWriter writer, Type type, object value) { SLJsonConverter <object, string> serialize; if (m_Converters.TryGetValue(type, out serialize)) { string s = serialize(value); if (s == null) { writer.WriteValueNull(); } else { writer.WriteValue(s); } return; } if (value == null) { writer.WriteValueNull(); } else if (value is bool) { writer.WriteValue((bool)value); } else if (value is sbyte) { writer.WriteValue((sbyte)value); } else if (value is byte) { writer.WriteValue((byte)value); } else if (value is short) { writer.WriteValue((short)value); } else if (value is ushort) { writer.WriteValue((ushort)value); } else if (value is int) { writer.WriteValue((int)value); } else if (value is uint) { writer.WriteValue((uint)value); } else if (value is long) { writer.WriteValue((long)value); } else if (value is ulong) { writer.WriteValue((ulong)value); } else if (value is float) { writer.WriteValue((float)value); } else if (value is double) { writer.WriteValue((double)value); } else if (value is DateTime) { writer.WriteValue((DateTime)value); } else if (value is TimeSpan) { writer.WriteValue((TimeSpan)value); } else { string s = value as string; if (s == null) { if (m_ThrowOnUnknownValueType) { throw new NotSupportedException("Unknown data type " + value.GetType().FullName + " is not supported"); } s = ToStringInvariant(value); } writer.WriteValue(s); } }