Можно (и, наверное, нужно) переопределить ToString класса Character, сериализовать там объект в json и результат сохранять в файл.
https://www.newtonsoft.com/json/help/html/Serializ...
https://stackoverflow.com/questions/16921652/how-t...
и т.д.
P.S. Если нужны команды, как вы описываете, то их тоже можно сохранять в файл в функции ToString(), используя например, string format
System.IO.File.WriteAllText(@"D:\path.txt", $"player.additem {this.id} {this.count}...");
P.P.S. Если нужно отслеживать, какие данные изменились... в сеттере любого свойства можно добавлять новое значение свойства в приватный список, соответствующий этому свойству. Если предыдущий элемент списка равен новому - добавляем null. Затем с помощью
такого оператора в string.format определяем, какую команду выводить в файл (если текущий item приватного списка НЕ null), а какую нет (если текущий item приватного списка null).