We have a problem when serializing using System.Text.Json.JsonSerializer.
In this example, we have three classes: Store, Employee, and Manager.  It is noted that Manager inherits from Employee.
public class Employee
{
    public string Name { get; set; }
    public int Age { get; set; }
}
public class Manager : Employee
{
    public int AllowedPersonalDays { get; set; }
}
public class Store
{
    public Employee EmployeeOfTheMonth { get; set; }
    public Manager Manager { get; set; }
    public string Name { get; set; }
}
In the class Store, we have a property called EmployeeOfTheMonth.  Well, as an example, suppose this property referenced the same object as the Manager property.  Because EmployeeOfTheMonth is serialized first, it will ONLY serialize the Employee properties.  When serializing the Manager property -- because it is second and the same object -- it will add a reference to the EmployeeOfTheMonth.  When we do this, we're losing the additional property attached to the Manager, which is AllowedPersonalDays.  Additionally, as you can see, it will not deserialize because -- while a Manager is an Employee -- an Employee is not a Manager.
Here's our short example:
Manager mgr = new Manager()
{
    Age = 42,
    AllowedPersonalDays = 14,
    Name = "Jane Doe",
};
Store store = new Store()
{
    EmployeeOfTheMonth = mgr,
    Manager = mgr,
    Name = "ValuMart"
};
System.Text.Json.JsonSerializerOptions options = new System.Text.Json.JsonSerializerOptions();
options.ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.Preserve;
string serialized = System.Text.Json.JsonSerializer.Serialize<Store>(store, options);
var deserialized = System.Text.Json.JsonSerializer.Deserialize<Store>(serialized, options); // <-- Will through an exception per reasons stated above
If we look at the variable serialized, this is the content:
{
  "$id":"1",
  "EmployeeOfTheMonth": {
    "$id":"2",
    "Name":"Jane Doe",
    "Age":42
  },
  "Manager": {
    "$ref":"2"
  },
  "Name":"ValuMart"
}
Using System.Text.Json.JsonSerializer, how can we get the EmployeeOfTheMonth to correctly serialize as a Manager?  That is, we need the serialization to look like the following:
{
  "$id":"1",
  "EmployeeOfTheMonth": {
    "$id":"2",
    "Name":"Jane Doe",
    "Age":42,
    "AllowedPersonalDays":14         <-- We need to retain this property even if the EmployeeOfTheMonth is a Manager
  },
  "Manager": {
    "$ref":"2"
  },
  "Name":"ValuMart"
}
I know I can adjust the ORDER of the properties in the Store class, but this is not an option and a very poor choice.  Thank you, all.
 
    