是否有必要在公共方法上声明属性[DataMember(Order = n)]?

时间:2010-06-08 12:26:52

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

在我的解决方案中,我创建了公共类来存储值,并且已经声明了[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中使用序列化程序来序列化我存储的数据,我必须声明这些属性。但我对方法的确不确定。

请帮忙。 先感谢您。

3 个答案:

答案 0 :(得分:1)

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

重新添加属性的主题;在当前版本中,它通常需要 something 来了解要序列化的属性(更重要的是:使用什么标识符)。 是隐式模式,但除非您知道,否则我不建议再次更改类型。永远。完全没有。

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

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

(不要引用我的确切的API,但有类似的东西)

然后您可以使用model.Serialize

答案 1 :(得分:0)

不 - 不应该在那里。你无法序列化方法!

答案 2 :(得分:0)

不仅属性以这种方式可读写......因此您无法为方法添加属性。