C#DynamoDB复杂类型IList转换器
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#DynamoDB复杂类型IList转换器,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2636字,纯文字阅读大概需要4分钟。
内容图文
![C#DynamoDB复杂类型IList转换器](/upload/InfoBanner/zyjiaocheng/788/cd573e91574541a6accdaf6b2b5ca823.jpg)
我需要添加一个IList< MyCustomType>作为DynamoDBProperty的DynamoDB表,其项目由MyTableItem类定义.
使用此AWS Documentation page中的信息,我实现了MyCustomType的转换器(不适用于IList< MyCustomType>).
但是在创建一个新的MyTableItem时,我注意到ToEntry()方法接收一个类型为IList< MyCustomType>的对象作为参数.而不是MyCustomType.
阅读文档我理解列表(列表或IList,或一般的集合)由DynamoDB自动处理…
我怎样才能达到预期的效果?
这是代码:
// MyTableItem
[Serializable]
public class MyTableItem
{
[DynamoDBHashKey]
public string Id { get; set; }
[DynamoDBProperty]
public string Field1 { get; set; }
[DynamoDBProperty]
public string Field2 { get; set; }
// List of MyCustomType objects
[DynamoDBProperty(typeof(MyCustomTypeConverter))]
public IList<MyCustomType> CustomField { get; set; }
}
// MyCustomType
[Serializable]
public class MyCustomType
{
public string DocumentType { get; set; }
public string Status { get; set; }
public string Code { get; set; }
}
// Converter methods
public class MyCustomTypeConverter : IPropertyConverter
{
public DynamoDBEntry ToEntry(object value)
{
if (value == null)
return new Primitive { Value = null };
MyCustomType item = value as MyCustomType;
if (item == null)
throw new InvalidCastException("Cannot convert MyCustomType to DynamoDBEntry.");
string data = string.Format("{0};{1};{2}", item.DocumentType, item.Status, item.Code);
DynamoDBEntry entry = new Primitive { Value = data };
return entry;
}
public object FromEntry(DynamoDBEntry entry)
{
if (entry == null)
return new MyCustomType();
Primitive primitive = entry as Primitive;
if (primitive == null || !(primitive.Value is string) || string.IsNullOrEmpty((string)primitive.Value))
throw new InvalidCastException("Cannot convert DynamoDBEntry to MyCustomType.");
string[] data = ((string)(primitive.Value)).Split(new string[] { ";" }, StringSplitOptions.None);
if (data.Length != 3)
throw new ArgumentOutOfRangeException("Invalid arguments number.");
MyCustomType complexData = new MyCustomType
{
DocumentType = Convert.ToString(data[0]),
Status = Convert.ToString(data[1]),
Code = Convert.ToString(data[2])
};
return complexData;
}
}
解决方法:
似乎DynamoDb SDK在序列化IList< T>时没有问题,它确实无法反序列化.只是推测,但这可能是因为它不知道使用哪种具体类型.
我有类似的设置,我尝试更改我的文档以使用List< T> SDK无需添加任何自定义IPropertyConverter实现即可反序列化.
如果您公开具体的List而不是接口,那么看起来只有完整的双向支持.这是摆脱问题的一种可能方式.
但是如果你想尝试解决IList的问题,我会使用SDK实际发送给你的是IList,而不是列表中的项目.对我来说,迭代该列表并将每个项目转换为条目列表是有意义的.对于反序列化,您将获得该条目集合,并且您可以构建新模型列表.
TL; DR如果可以,则使用列表,否则针对IList< T>实现转换器.不是T.
内容总结
以上是互联网集市为您收集整理的C#DynamoDB复杂类型IList转换器全部内容,希望文章能够帮你解决C#DynamoDB复杂类型IList转换器所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。