2013-06-19 48 views
14

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

在protobuf网网站在GettingStarted部分它说:

不喜欢的属性?
在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 { 
} 

回答

12

澄清的价值:最该答案涉及预编辑的问题,其中false是传递到RuntimeTypeModel.Add(...)


我已经使用了您的通气T代码(我推断,这是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网版完全相同
  • 如果这些[DataContract]/[DataMember]属性是System.Runtime.Serialization.dll者,或你自己的(对不起,如果这似乎是一个奇怪的问题)

要充分回答这个问题:如果你不能有任何属性(一第二你也蛮好的那些),你也可以这样做:

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

这将配置PropertyA关键1,和PropertyB关键2.

+0

感谢快速反应!我使用相同的版本。我的'RuntimeTypeModel.Default.Add(typeof(MyEntity),...)'中的第二个参数实际上是'false'。有了“真”或根本没有这个电话,我就可以得到和你一样的结果。 – Mike

+0

@Mike啊,对;是的,“false”意味着“不看属性”,其中包括不看“DataMember(Order = n)”属性。如果你通过'false',你需要手动配置* - 这就是我在上面的例子中所做的。如果您想使用'DataMember(Order = n)'属性:说'真' –

+0

顺便说一句,最好让这些'.Add(1,“PropertyA”)'部件接受Expression作为第二个强类型和编译器检查的参数:)这将减轻非属性类型的工作量。 – Mike

相关问题