簡體   English   中英

DynamoDB ExclusiveStartKey 的字典序列化不起作用

[英]Dictionary serialization for DynamoDB ExclusiveStartKey not working

對於來自 Dynamo 的分頁響應,我試圖保留ExclusiveStartKey值。 在代碼示例中,如果我直接使用response.LastEvaluatedKey值,則后續請求可以正常工作。

但是,如果我序列化response.LastEvaluatedKey ,然后將其序列化回用作ExclusiveStartKey值,則后續請求將失敗並顯示以下錯誤消息:

提供的起始鍵無效:一個或多個參數值無效:Null 屬性值類型的值必須為真

反序列化的字典似乎與原始字典具有相同的值……有什么要檢查的,看看兩者之間有什么不同嗎?

QueryResponse response = null;

do
{

    string gsiPartitionKey = "gsi-pk-value-1";

    var queryRequest = new QueryRequest()
    {
        TableName = "my-table",
        IndexName = "my-index",
        KeyConditionExpression = "IndexPk = :s_gsiPartitionKey",
        ExpressionAttributeValues = new Dictionary<string, AttributeValue>
        {
            {
                ":s_gsiPartitionKey", new AttributeValue { S = gsiPartitionKey}
            }
        },
        Limit = 1
    };

    if (response != null)
    {
        //OPTION 1 - OK - Using LastEvaluatedKey directly works fine
        //queryRequest.ExclusiveStartKey = response.LastEvaluatedKey;

        //OPTION 2 - BAD - Serializing and deserializing  fails
        var serialized = JsonConvert.SerializeObject(response.LastEvaluatedKey);
        var deserialized = JsonConvert.DeserializeObject<Dictionary<string, AttributeValue>>(serialized);
        queryRequest.ExclusiveStartKey = deserialized;
    }

    response = await DynamoDbClient.QueryAsync(queryRequest);

} while (response.LastEvaluatedKey.Count != 0);

我今天遇到了這個問題,我想我會更新這個。 AttributeValue類中,有一個bool?類型的非公共成員_null bool? 從 JSON 反序列化時初始化不正確。 它被設置為false時,應設置為null

使用反射,反序列化后,我將字典中每個鍵的值設置為null ,AWS 現在按預期返回數據。

要訪問私有成員,我使用了這個函數:

public void SetPrivatePropertyValue<T>(object obj, string propName, T val)
{
    Type t = obj.GetType();

    // add a check here that the object obj and propertyName string are not null
    foreach (FieldInfo fi in obj.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic))
    {
        if (fi.Name.ToLower().Contains(propName.ToLower()))
        {
            fi.SetValue(obj, val);
            break;
        }
    }
}

方法調用是SetPrivatePropertyValue<bool?>(attribute, "_null", null);

祝你好運!

使用自定義 json 轉換器。

https://learn.microsoft.com/en-us/do.net/standard/serialization/system-text-json-converters-how-to

就我而言,我知道我只是序列化AttributeValueS字符串實例,因此轉換器很簡單,但如果需要,可以對其進行調整以處理所有可用類型。

轉換器:

public class AttributeValueJsonConverter : JsonConverter<AttributeValue>
{
    public override AttributeValue Read(
        ref Utf8JsonReader reader,
        Type typeToConvert,
        JsonSerializerOptions options) => new AttributeValue(reader.GetString());

    public override void Write(
        Utf8JsonWriter writer,
        AttributeValue attributeValue,
        JsonSerializerOptions options) => writer.WriteStringValue(attributeValue.S);
}

當我序列化LastEvaluatedKey時,您可以看到我是如何使用這個轉換器的,它是Dictionary<string, AttributeValue> -

var jsonSerializerOptions = new JsonSerializerOptions
{
    Converters =
    {
        new AttributeValueJsonConverter()
    }
};
var serialized = JsonSerializer.Serialize(queryResponse.LastEvaluatedKey, jsonSerializerOptions);
var deserialized = JsonSerializer.Deserialize<Dictionary<string, AttributeValue>>(serialized, jsonSerializerOptions);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM