.NET中DynamoDB无法反序列化IList<T>的原因是什么?
问题根源
DynamoDB .NET SDK的序列化器在反序列化时依赖具体可实例化类型,IList<T>作为接口无法直接被实例化。之前用List<T>时,序列化器能直接创建List<T>实例填充数据;改成IList<T>后,SDK默认尝试用内部的DynamoDBList来适配,但这个类型和你的IList<MyModel>不兼容,于是抛出类型转换错误。
序列化正常是因为:序列化只需要遍历集合内容,只要实现IEnumerable<T>就能输出为DynamoDB的L类型条目,不需要关心具体实现类。
解决办法
通过特性指定具体实现类
在IList<T>属性上添加[DynamoDBProperty]特性,明确告诉序列化器要使用的具体类型:[DynamoDBProperty(typeof(List<MyModel>))] public IList<MyModel> MyModels { get; set; } = new List<MyModel>();反序列化时SDK会创建
List<MyModel>实例,再赋值给IList<MyModel>属性,类型兼容即可正常工作。内部用具体类型存储,对外暴露接口
保持对外的IList<T>接口符合CA1002规则,内部用List<T>字段存储数据:private List<MyModel> _myModels = new List<MyModel>(); public IList<MyModel> MyModels { get => _myModels; set => _myModels = value is List<MyModel> list ? list : new List<MyModel>(value); }这种方式不需要额外特性,SDK会自动处理私有字段的序列化(若需要更明确,可给字段加
[DynamoDBProperty],属性加[DynamoDBIgnore])。自定义序列化转换器
实现IPropertyConverter接口,手动控制IList<T>的序列化/反序列化逻辑,强制用List<T>实例化:public class IListConverter<T> : IPropertyConverter { public object FromEntry(DynamoDBEntry entry) { var listEntry = entry as DynamoDBList; return listEntry?.ToList<T>() ?? new List<T>(); } public DynamoDBEntry ToEntry(object value) { var list = value as IEnumerable<T>; return new DynamoDBList(list?.Select(DynamoDBEntry.FromObject)); } }然后在属性上添加特性:
[DynamoDBProperty(typeof(IListConverter<MyModel>))]
内容的提问来源于stack exchange,提问作者user246392
相关产品推荐
相关产品推荐

