使用.NET SDK在DynamoDB中保留动态对象

Car*_*lis 5 .net c# amazon-dynamodb asp.net-core

我正在尝试使用.NET SDK将以下类保留到DynamoDB:

public class MyClass
{
    public string Id { get; set; }

    public string Name { get; set; }

    public object Settings { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

问题在于Settings属性.它可以是任何类型的对象,我事先并不知道可能分配给它的是什么.当我尝试将其持久化到DynamoDB时,我得到以下异常:

System.InvalidOperationException: 'Type System.Object is unsupported, it has no supported members'
Run Code Online (Sandbox Code Playgroud)

文档模型和对象持久性模型方法都会导致相同的异常.

有没有办法在DynamoDB中保留这些对象?其他数据库(如MongoDB和Azure DocumentDB)可以毫无问题地执行此操作,并且可以将它们反序列化为具有鉴别器的正确类型,或者作为动态JSON对象.

Joh*_*car 8

您可以使用此处记录的一般方法:https : //docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBContext.ArbitraryDataMapping.html

这是我对任意对象的实现:

public class DataConverter : IPropertyConverter
{
    public object FromEntry(DynamoDBEntry entry)
    {
        var primitive = entry as Primitive;
        if (primitive == null || !(primitive.Value is String) || string.IsNullOrEmpty((string)primitive.Value))
            throw new ArgumentOutOfRangeException();
        object ret = JsonConvert.DeserializeObject(primitive.Value as string);
        return ret;
    }

    public DynamoDBEntry ToEntry(object value)
    {
        var jsonString = JsonConvert.SerializeObject(value);
        DynamoDBEntry ret = new Primitive(jsonString);
        return ret;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样注释你的属性:

[DynamoDBProperty(typeof(DataConverter))]
public object data { get; set; }
Run Code Online (Sandbox Code Playgroud)