在 WCF 中使用 protobuf 时,我们可以使用 [DataMember] 而不是 [ProtoMember] 吗?

Can we use [DataMember] instead of [ProtoMember] while use protobuf in WCF?

我已经有一个使用 DataContract 属性的服务。我们想切换到 protobuf 实现,但是如果我们必须更改所有属性,那将是一个很大的工作量。

是否可以不使用 ProtoMemberProtoContract 并让 ProtoBuf 使用 DataMemberDataContract 属性?

谢谢

当然; protobuf-net 对 [DataContract] / [DataMember] 非常满意,只要 它仍然可以获得有效数字,它通过查找 Order 属性 个 DataMemberAttribute

但是,有一个小问题... svcutil 等工具不保证 实际数字 - 只是顺序。这可能会导致难以确保双方的 相同 号码。此外,svcutil 倾向于从 开始,而不是从一开始 - 零不是 protobuf 的有效字段编号。如果你得到的数字全部不一致,那么你可以通过在带有修正的单独文件中添加 partial class 来调整它,例如:

[ProtoContract(DataMemberOffset = 1)]
partial class Whatever { }

但是,如果数字现在到处都是(因为它们最初不是连续的),您可能想要或者[=36] =] 使用多个 [ProtoPartialMember(...)] 属性来告诉它如何映射每个属性(记住您可以使用 nameof 而不是对成员名称进行硬编码):

[ProtoContract]
[ProtoPartialMember(1, nameof(SomeStringValue))]
[ProtoPartialMember(2, nameof(WhateverId))]
partial class Whatever { }

或者只是共享原始类型定义,这可能更容易。