没有属性的Protobuf-net序列化

本文关键字:Protobuf-net 序列化 属性 | 更新日期: 2023-09-27 18:19:11

我有一个DataContracts程序集,我需要为它生成.proto模式,以便能够与java系统交换数据。可以更改DataContracts代码,但我不能在其中添加[ProtoContract][ProtoMember]属性,因为这会导致protobuf-net组件依赖。我们在系统的c#部分使用WCF,所以我们不希望在大多数不与java系统一起工作的c#项目中依赖于proto-buf汇编。

在protobuf-net网站的入门部分中说:

不喜欢属性?
在v2中,可以使用属性完成的所有操作也可以在运行时通过RuntimeTypeModel进行配置。

然而,我不知道如何实际配置没有属性的序列化,我没有看到任何这样的例子。

I'm try to do

[DataContract]
public class MyEntity
{
    [DataMember(Order = 1)]
    public String PropertyA { get; set; }
    [DataMember(Order = 2)]
    public int PropertyB { get; set; }
}
RuntimeTypeModel.Default.Add(typeof(MyEntity), false);
string proto = Serializer.GetProto<MyEntity>();

,得到proto

的值如下
package ProtobufTest;
message MyEntity {
}

没有属性的Protobuf-net序列化

澄清:这个答案大部分与编辑前的问题有关,其中false被传递给RuntimeTypeModel.Add(...)


我使用了您的确切代码(我推断这是在namespace ProtobufTest中,但其余部分是从问题中复制/粘贴)与r2.0.0.640(当前的NuGet部署),我得到:

package ProtobufTest;
message MyEntity {
   optional string PropertyA = 1;
   optional int32 PropertyB = 2 [default = 0];
}
此外,即使删除RuntimeTypeModel.Default.Add(...)行,也会得到完全相同的结果。

我不清楚为什么你看到了不同的东西-你能澄清一下吗?

  • 您使用的是哪个protobuf-net版本
  • 如果这些[DataContract]/[DataMember]属性是System.Runtime.Serialization.dll属性,或您自己的(抱歉,如果这似乎是一个奇怪的问题)

要完整地回答这个问题:如果你不能有任何属性(你有的属性就很好),你也可以这样做:

RuntimeTypeModel.Default.Add(typeof(MyEntity), false)
    .Add(1, "PropertyA")
    .Add(2, "PropertyB");

PropertyA配置为密钥1,PropertyB配置为密钥2。