【问题标题】:How to make TableEntity serialize non-public properties?如何使 TableEntity 序列化非公共属性?
【发布时间】:2018-08-03 16:22:51
【问题描述】:

Azure 表存储有一些令人沮丧的限制,例如无法处理 decimal 数据类型,所以我必须这样做:

public class MyEntity : TableEntity {
        [IgnoreProperty]
        public decimal ListPrice
        {
            get => decimal.Parse(this.ListPrice_, CultureInfo.InvariantCulture);
            set => this.ListPrice_ = value.ToString(CultureInfo.InvariantCulture);
        }

        public string ListPrice_ { get; set; }
}

显然我不希望 ListPrice_ 成为 publicprivate 成员似乎被 SDK 忽略了。有什么简单的技巧可以让它序列化非公共成员(没有反射)?

【问题讨论】:

  • 私有成员是私有的。类之外的任何东西都没有任何可见性,所以不,你不能序列化非公共成员(没有反射)
  • 我相信这不是它应该如何工作的,它依赖于序列化。例如,如果我使用DataContractSerializer,我可以将[DataMember] 放在任何私人成员上,它会被处理得很好。作为开发人员,我们应该完全控制数据结构的序列化,不是吗?
  • DataContractSerializer 使用反射...事实上所有的序列化器都使用反射
  • 我不明白这一点。几乎我知道的任何序列化程序都允许处理非公共成员,如果不是默认情况下而是使用覆盖(基于属性或代码)。我不在乎他们是否在内部使用反射我不想在我的用户代码中使用它(如果我想要它,我会覆盖 WriteEntity()/ReadEntity() 而不会打扰社区)。问题是我不知道 SDK 如何处理序列化以及它是否允许覆盖默认行为。我很高兴知道 SDK 中是否有选项标志或等效的 [DataMember] 可以用来装饰我的成员。

标签: c# .net azure serialization azure-table-storage


【解决方案1】:

我不知道有什么属性可以用来序列化TableEntity的非公共属性,但是你可以重写接口ITableEntityReadEntityWriteEntity方法来自定义你自己的属性序列化.

public class MyEntity : TableEntity
{
    [IgnoreProperty]
    public decimal ListPrice
    {
        get => decimal.Parse(this.ListPrice_, CultureInfo.InvariantCulture);
        set => this.ListPrice_ = value.ToString(CultureInfo.InvariantCulture);
    }

    private string ListPrice_ { get; set; }

    public override void ReadEntity(IDictionary<string, EntityProperty> properties, OperationContext operationContext)
    {
        this.ListPrice_ = properties[nameof(ListPrice)].StringValue;
    }

    public override IDictionary<string, EntityProperty> WriteEntity(OperationContext operationContext)
    {
        var properties = new Dictionary<string, EntityProperty>();
        properties.Add(nameof(ListPrice), new EntityProperty(this.ListPrice_));
        return properties;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 2012-08-29
    • 2018-03-06
    • 2013-03-07
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    相关资源
    最近更新 更多