没有属性的protobuf-net序列化

时间:2013-06-19 21:20:34

标签: c# protobuf-net

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

GettingStarted部分的protobuf-net网站上,它说:

  

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

但是我不知道如何在没有属性的情况下实际配置序列化,我还没有看到任何示例。

我正在尝试

[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 {
}

1 个答案:

答案 0 :(得分:12)

澄清:此答案的大部分内容与编辑前问题有关,其中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。