.Net C# Json 反序列化抽象类错误的具体实现

问题描述

我想将交易列表作为 json 存储在列表中。 (注册交易,注销交易等)。每个交易都有一个上传方法上传方法的实现特定于交易类型(在服务器上调用不同的端点)。

为此,我创建了一个名为“TransactionTypeBase”的抽象类,其中包含一个上传方法,该方法将在反序列化和枚举具体交易类型列表时被覆盖和触发。

问题是在反序列化 List<TransactionTypeBase> 时出现此错误

不支持没有无参数构造函数的引用类型的反序列化。输入 MyProject.TransactionTypeBase'(也不确定在这种情况下序列化是否正确完成)

我确实从研究中了解到我必须创建一个继承自 JsonConverter 的自定义转换器,但我不确定如何为我的案例实际实现它,这就是我需要帮助的地方。

这是我的代码

public abstract class TransactionTypeBase
    {
        public abstract TransactionType TransactionType { get; }

        public abstract Task UploadToServer(Data data);
    }

    public enum TransactionType
    {
        Register = 1,Unregister = 2
    }

public class RegisterTransactionType : TransactionTypeBase
    {
        public override TransactionType TransactionType => TransactionType.Register;

        public override async Task UploadToServer(Data data)
        {
            // Call Register API endpoint
        }
    }

public class UnregisterTransactionType : TransactionTypeBase
    {
        public override TransactionType TransactionType => TransactionType.Unregister;

        public override async Task UploadToServer(Data data)
        {
            // call Unregister API endpoint
        }
    }


    public class Transactions : List<TransactionTypeBase>
    {

        public void Add(TransactionTypeBase type)
        {
            if (type is RegisterTransactionType)
            {
                // do some optional additional work
            }

            base.Add(type);
        }
    }


   public class Data
   {
      public int Id {get;set;}
      public string Username {get;set;}
      ..........................
   }

使用中:

......

var transactions = new Transactions();

if (isRegister)
   transactions.Add(new RegisterTransactionType());
else
   transactions.Add(new UnregisterTransactionType());

.......

以 json 格式存储交易:

var serializedTransactionList = JsonSerializer.Serialize<Transactions>();

稍后反序列化和枚举(以及发生错误的地方):

var deserializedTransactionList = JsonDeserialize<Transactions>(serializedTransactionList);

目的是为了实现这一点,以便稍后在由于任何其他原因连接互联网时触发保存的交易:

foreach (var transaction in deserializedTransactionList)
 {
   transaction.Upload(data); // where the endpoint is called based on what type of transaction it is.
 }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)