【问题标题】:Migrate from Microsoft.WindowsAzure.Storage.Table to Azure.Data.Tables - deserialization issues从 Microsoft.WindowsAzure.Storage.Table 迁移到 Azure.Data.Tables - 反序列化问题
【发布时间】:2022-12-09 02:06:11
【问题描述】:

我正在将代码从 Microsoft.WindowsAzure.Storage.Table 迁移到 Azure.Data.Tables。所描述的问题出现在查询内容与数据类型不匹配的实体上。考虑以下迁移代码的 sn-p:

public class WorkstationInfoTableEntity : Azure.Data.Tables.ITableEntity
{
    //ITableEntity
    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public DateTimeOffset? Timestamp { get; set; }
    public ETag ETag { get; set; }

    //
    public byte[] Documents { get; set; }
    public DateTime? MyDocumentsLastRestoreDate { get; set; }
    public DateTime? MyDocumentsModifiedOn { get; set; }    
    ....
    //
}
var table = tableServiceClient.GetTableClient(CloudTableNames.Workstations);
var workstations = table.Query<WorkstationInfoTableEntity>(c => c.PartitionKey == customerId);
var results = workstations.OrderBy(c => c.Name).ToArray();

如果表包含一个包含一些字符串的实体:“[RME]”(任何非 base64 字符串) 在里面文件列然后查询将失败抱怨: "System.FormatException: 'The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters." 因为它需要一个 base64 字符串,但值只是一些字符串。

或者,如果 MyDocumentsModifiedOn 列中包含一些空字符串,则查询会因错误而崩溃: "System.FormatException: 'String was not recognized as a valid DateTime."

如果出现反序列化问题,Microsoft.WindowsAzure.Storage.Table 库将使用空值填充该属性。

预期是一个实体列表,其反序列化失败的属性设置为 null。 实际行为:代码崩溃

如果出现任何反序列化问题,有什么方法可以防止崩溃吗?

现在,不可能纠正这些实体。

【问题讨论】:

    标签: c# azure-table-storage azure-tablequery azure-tableclient


    【解决方案1】:

    所以这更像是一种解决方法,因为您无法将所有空的 MyDocumentsModifiedOn 更新为 DateTime.MinValue。

        public class WorkstationInfoTableEntity : Azure.Data.Tables.ITableEntity
        {
            //ITableEntity
            public string PartitionKey { get; set; }
            public string RowKey { get; set; }
            public DateTimeOffset? Timestamp { get; set; }
            public ETag ETag { get; set; }
    
            //
            public byte[] Documents { get; set; }
            public DateTime? MyDocumentsLastRestoreDate { get; set; }
            public DateTime? _MyDocumentsModifiedOn { get; set; }    
            public string? MyDocumentsModifiedOn 
            { 
                get
                {
                    return _MyDocumentsModifiedOn.ToString() // Or whatever format you need
                }
                set
                {
                    if(!Value.HasValue)
                    {
                        _MyDocumentsModifiedOn = DateTime.MinValue;
                    }
                    else if(Value.Value == "")
                    {
                        _MyDocumentsModifiedOn = DateTime.MinValue;
                    }
                    else
                    {
                        DateTime TempDate;
                        if(DateTime.TryParse(Value.Value, out TempDate))
                        {
                            _MyDocumentsModifiedOn = TempDate
                        }
                        else
                        {
                            _MyDocumentsModifiedOn = DateTime.MinValue;
                        }
                    }
                }
            }  
            ....
            //
        }
    

    您将必须使用 _MyDocumentsModifiedOn 来获取日期时间。这不是一个了不起的解决方案,但它会起作用。

    【讨论】:

      猜你喜欢
      • 2014-12-30
      • 1970-01-01
      • 2022-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      相关资源
      最近更新 更多