SharpYaml supports polymorphism in a JSON-like way by default: using a discriminator property within a mapping.
It also supports YAML tags as an alternative discriminator style.
Use JsonPolymorphicAttribute and JsonDerivedTypeAttribute:
using System.Text.Json.Serialization;
[JsonPolymorphic(TypeDiscriminatorPropertyName = "$type")]
[JsonDerivedType(typeof(Dog), "dog")]
[JsonDerivedType(typeof(Cat), "cat")]
public abstract class Animal
{
public string Name { get; set; } = "";
}
When serialized, a discriminator property is emitted:
$type: dog
Name: Rex
Use YamlPolymorphicAttribute and YamlDerivedTypeAttribute:
using SharpYaml.Serialization;
[YamlPolymorphic(DiscriminatorStyle = YamlTypeDiscriminatorStyle.Tag)]
[YamlDerivedType(typeof(Dog), "dog", Tag = "!dog")]
public abstract class TaggedAnimal
{
}
YamlDerivedType/JsonDerivedType) over free-form type names.