public override void Read(object input, ObjectReader reader, Writer writer, PartialOptions optionsOverride) { IDictionary dictionary = input as IDictionary; if (dictionary == null) return; if (ReferenceStructure(input, reader, optionsOverride)) return; if (ShouldWriteTypeIdentifier(reader.Options, optionsOverride)) writer.BeginStructure(CurrentTypeResolver.GetTypeIdentifier(Type), reader.GetType()); else writer.BeginStructure(Type); foreach (object key in dictionary.Keys) { // Convert.ToString is in case the keys are numbers, which are represented // as strings when used as keys, but can be indexed with numbers in JavaScript string name = Convert.ToString(key, CultureInfo.InvariantCulture); object value = dictionary[key]; writer.AddProperty(name); ValueTypeDef.ReadObject(value, reader, writer, PartialOptions.Default); } writer.EndStructure(); }
public override void Read(object input, ObjectReader reader, Writer writer, PartialOptions optionsOverride) { if (ReferenceStructure(input, reader, optionsOverride)) return; if (ShouldWriteTypeIdentifier(reader.Options, optionsOverride)) writer.BeginStructure(CurrentTypeResolver.GetTypeIdentifier(Type), reader.GetType()); else writer.BeginStructure(Type); for (int i = 0; i < AllSerializableProperties.Length; i++) { PropertyDefinition property = AllSerializableProperties[i]; if (property.MatchesPropertyFilter(reader.Options)) { writer.AddProperty(property.SerializedName); reader.PropertyStack.Push(property); object value = property.GetFrom(input); property.Read(value, reader, writer); reader.PropertyStack.Pop(); } } writer.EndStructure(); }
private void WriteInternal <T>(T value, Type explicitType) { if (value == null) { Writer.WriteValue().Null(); return; } var ambiguous = !explicitType.IsSealed; var type = ResolveRedirect(ambiguous ? value.GetType() : explicitType); var handler = handlers.GetHandler(type); var typedHandler = handler as ITrwSerializationHandler <T>; void WriteContentWithHandler() { if (typedHandler != null) { typedHandler.SaveContent(this, value); } else { handler.SaveContent(this, value); } } bool writeType; switch (options.ExplicitTypes) { case TrwSerializationExplicitTypes.Never: writeType = false; break; case TrwSerializationExplicitTypes.WhenAmbiguous: writeType = ambiguous; break; case TrwSerializationExplicitTypes.WhenObject: writeType = handler.ContentIsProperties; break; case TrwSerializationExplicitTypes.WhenAmbiguousOrObject: writeType = ambiguous || handler.ContentIsProperties; break; case TrwSerializationExplicitTypes.Always: writeType = true; break; default: throw new ArgumentOutOfRangeException(); } if (writeType) { Writer.StartObject(); Writer.AddProperty(options.TypePropertyName); WriteType(type); if (!handler.ContentIsProperties) { Writer.AddProperty(options.ValuePropertyName); } WriteContentWithHandler(); Writer.EndObject(); } else { if (!handler.ContentIsProperties) { WriteContentWithHandler(); } else { Writer.StartObject(); WriteContentWithHandler(); Writer.EndObject(); } } }