在 WCF 中使用 protobuf 时,我们可以使用 [DataMember] 而不是 [ProtoMember] 吗?
Can we use [DataMember] instead of [ProtoMember] while use protobuf in WCF?
我已经有一个使用 DataContract
属性的服务。我们想切换到 protobuf 实现,但是如果我们必须更改所有属性,那将是一个很大的工作量。
是否可以不使用 ProtoMember
和 ProtoContract
并让 ProtoBuf 使用 DataMember
和 DataContract
属性?
谢谢
当然; 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 { }
或者只是共享原始类型定义,这可能更容易。
我已经有一个使用 DataContract
属性的服务。我们想切换到 protobuf 实现,但是如果我们必须更改所有属性,那将是一个很大的工作量。
是否可以不使用 ProtoMember
和 ProtoContract
并让 ProtoBuf 使用 DataMember
和 DataContract
属性?
谢谢
当然; 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 { }
或者只是共享原始类型定义,这可能更容易。