问题描述
我想将交易列表作为 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 (将#修改为@)