Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何序列化System.Text.Json中的抽象类_C#_Json_.net Core_System.text.json - Fatal编程技术网

C# 如何序列化System.Text.Json中的抽象类

C# 如何序列化System.Text.Json中的抽象类,c#,json,.net-core,system.text.json,C#,Json,.net Core,System.text.json,我有以下课程 public abstract class Settings { private string _filename; protected virtual void defaults() { } public static T Load<T>(string filename) where T : Settings, new()

我有以下课程

public abstract class Settings
    {
        private string _filename;
        
        protected virtual void defaults()
        {
            
        }

        public static T Load<T>(string filename) where T : Settings, new()
        {
            T theSetting;
            if (File.Exists(filename))
            {
                var reader = new StreamReader(filename);
                var configJson = reader.ReadToEnd();
                reader.Close();
                theSetting = System.Text.Json.JsonSerializer.Deserialize<T>(configJson);
            }
            else
            {
                theSetting = new T();
                theSetting.defaults();
            }

            theSetting._filename = filename;
            theSetting.Save();

            return theSetting;
        }

        public void Save()
        {
            var writer = new StreamWriter(_filename);
            writer.Write(JsonSerializer.Serialize(this));
            writer.Close();
        }

        public void SaveAs(string filename)
        {
            _filename = filename;
            Save();
        }
    }
我知道.NETCore不支持多态性,但我在这里找到了几个答案

问题是,所有答案都适用于我们有模型类的情况,但在我的示例中,模型类没有指定,而是由用户创建的


我还尝试了answer,它没有出现任何问题,但我不想在我的项目中使用外部库

也许只是拆分数据和类,您可以避免这个问题

public abstract class Settings<T>
{
    protected T _t;
    
    protected virtual void defaults()
    {
        
    }

    public static T Load<T>(string filename)
    {
        //....
    } 

    public void Save()
    {
        var writer = new StreamWriter(_filename);
        writer.Write(JsonSerializer.Serialize(_t));
        writer.Close();
    }
}
用这个

public class PolymorphicJsonConverter<T> : JsonConverter<T>
{
    public override bool CanConvert(Type typeToConvert)
    {
        return typeof(T).IsAssignableFrom(typeToConvert);
    }

    public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        throw new NotImplementedException();
    }

    public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
    {
        if (value is null)
        {
            writer.WriteNullValue();
            return;
        }

        writer.WriteStartObject();
        foreach (var property in value.GetType().GetProperties())
        {
            if (!property.CanRead)
                continue;
            var propertyValue = property.GetValue(value);
            writer.WritePropertyName(property.Name);
            JsonSerializer.Serialize(writer, propertyValue, options);
        }
        writer.WriteEndObject();
    }
}
当您想要序列化时:

options.Converters.Add(new PolymorphicJsonConverter<T>());
string json = JsonSerializer.Serialize(this, options);
我不想在我的项目中使用外部库为什么不?如果有一个库可以解决您遇到的问题,那么您应该使用该库,而不是重新发明轮子。