【问题标题】:Is it necessary to declare attribute [DataMember(Order=n)] on public method?是否需要在公共方法上声明属性 [DataMember(Order=n)]?
【发布时间】:2010-06-08 12:26:52
【问题描述】:

在我的解决方案中,我创建了公共类来存储值并已声明 [DataContract/DataMember] 属性。

例如,

[DataContract]
public class MeterSizeInfo
{
    string _meterSizeId;

    [DataMember(Order = 1)]
    public string MeterSizeId
    {
        get { return this._meterSizeId; }
        set { this._meterSizeId = value; }
    }

    string _meterSizeName;

    [DataMember(Order = 2)]
    public string MeterSizeName
    {
        get { return this._meterSizeName; }
        set { this._meterSizeName = value; }
    }

}

然后我需要添加另一个公开方法来暴露整个项目。 我想知道我是否必须为此添加 [DataMember(Order = 3)]。

    [DataMember(Order = 3)] //<--- must declare or not?
    public string DoSomething()
    {
        // do something...
    }

我知道如果我想在 protobuf-net 中使用序列化程序来序列化我存储的数据,我必须声明这些属性。但我不确定那个方法。

请帮忙。 先感谢您。

【问题讨论】:

    标签: c# protocol-buffers protobuf-net datamember


    【解决方案1】:

    protobuf-net 是一个值序列化器;它对方法一无所知,除了属性。如果您使用相同(或兼容)的类型,则该方法将自动出现,但这与 protobuf-net(或任何其他序列化)无关。

    关于添加属性的话题;在当前版本中,它通常需要 something 来知道要序列化哪些属性(更重要的是:使用哪些标识符)。 一种隐式模式,但我不推荐它,除非你知道你不会再改变类型。曾经。完全没有。

    在“v2”中,可以删除属性;您可以选择为此使用外部模型,因此您可能有:

    var model = TypeModel.Create();
    model[typeof(MeterSizeInfo)].Add("MeterSizeId", "MeterSizeName");
    

    (不要引用我的确切 API,而是类似的)

    然后您可以使用model.Serialize

    【讨论】:

      【解决方案2】:

      不 - 不应该在那里。你不能序列化一个方法!

      【讨论】:

        【解决方案3】:

        只有属性才能以这种方式读写……所以你不能为方法添加属性。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-20
          • 2011-10-11
          • 2014-06-20
          • 2019-08-22
          • 2014-03-05
          • 2021-07-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多