Amazon DynamoDB存储自定义对象列表

时间:2016-02-18 08:25:44

标签: c# amazon-web-services amazon-dynamodb

我第一次使用Amazon DynamoDB(它非常棒)。我正在使用我的对象持久性模型,所以我使用自己的对象来回发送。这对我的原始属性(字符串等)很有用。但是我还有一个属性,它是我想要存储的其他自定义对象的列表,我无法将其提交给数据库。这是一个自定义对象列表;每个对象都有一些原始属性和另一个自定义对象列表(这些对象上只有原语)。我发现了这个:

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ArbitraryDataMappingHLAPI.html

并试图复制它但无法让它工作。我也在存储地图时发现了这个:

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModel.DataTypes

但是这似乎并不直接与对象一起工作,除非我遗漏了一些东西。无论如何,这是我提出的转换器:

public class AwsCommentConverter : IPropertyConverter
{
    public object FromEntry(DynamoDBEntry entry)
    {
        PrimitiveList primList = entry as PrimitiveList;

        if (primList == null)
        { throw new ArgumentOutOfRangeException(); }

        List<CommentVM> comments = new List<CommentVM>();
        foreach (string s in primList.AsListOfString())
        {
            string[] vals = s.Split(new string[] { "$~$" }, StringSplitOptions.None);
            if (vals.Length < 3) throw new ArgumentOutOfRangeException();

            List<StatusUpdate> updates = new List<StatusUpdate>();
            for (int i = 2; i < vals.Length; i++)
            {
                string[] udVals = vals[i].Split(new string[] { "#@#" }, StringSplitOptions.None);
                if (udVals.Length != 4) throw new ArgumentOutOfRangeException();

                StatusUpdate ud = new StatusUpdate()
                {
                    StatusType = (StatusUpdate.StatusUpdateType)Enum.Parse(typeof(StatusUpdate.StatusUpdateType), udVals[0]),
                    StatusDate = DateTime.FromFileTime(long.Parse(udVals[1])),
                    UserName = udVals[2],
                    NewValue = udVals[3]
                };

                updates.Add(ud);
            }
            comments.Add(new CommentVM(vals[0], vals[1], updates));
        }
        return comments;
    }

    public DynamoDBEntry ToEntry(object value)
    {
        List<CommentVM> comments = value as List<CommentVM>;
        List<Primitive> storageVals = new List<Primitive>();

        if (comments == null) throw new ArgumentOutOfRangeException();

        foreach (CommentVM cm in comments)
        {
            string dta = cm.ID + "$~$" + cm.CommentText + "$~$";
            foreach (StatusUpdate ud in cm.StatusLog)
            { dta += ud.StatusType.ToString() + "#@#" + ud.StatusDate.ToFileTime().ToString() + "#@#" + ud.UserName + "#@#" + ud.NewValue + "$~$"; }

            if (dta.EndsWith("$~$"))
            { dta = dta.Substring(0, dta.Length - 3); }

            storageVals.Add(new Primitive() { Value = dta });
        }
        return new PrimitiveList() { Entries = storageVals };
    }
}

这是财产声明:

    [DynamoDBProperty(typeof(AwsCommentConverter))]
    public List<CommentVM> Comments

我在转换器中设置了一个断点,它似乎永远不会被击中,这让我相信我搞砸了设置它,但我不确定如何...谁能告诉我如何得到它存储和检索?

1 个答案:

答案 0 :(得分:0)

好的,我想我明白了。该属性是只读的,显然这意味着它被跳过?它是一个列表,它没有setter,因为列表是在创建对象时构建的,并且列表对象本身不应该被真正替换,尽管列表的内容经常被修改(因此需要存储他们在db)。

我添加了一个setter,现在它可以使用对象持久性模型和我的自定义转换器......