C# protobuf无属性的网络序列化

C# protobuf无属性的网络序列化,c#,protobuf-net,C#,Protobuf Net,我有一个带有DataContracts的程序集,我需要生成.proto模式,以便它能够与java系统交换数据。DataContracts代码可以更改,但我无法在其中添加[ProtoContract]和[ProtoMember]属性,因为这将导致protobuf网络程序集依赖性。我们在系统的C#部分中使用WCF,因此我们不希望在大多数不使用java系统的C#项目中依赖proto buf assembly 在protobuf网站的一个部分中,有这样一句话: 不喜欢属性? 在v2中,可以使用属性完成的

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

在protobuf网站的一个部分中,有这样一句话:

不喜欢属性?
在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>();

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


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

package ProtobufTest;

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

我不清楚你为什么会看到不同的东西-你能澄清一下:

  • 您使用的是哪个protobuf网络版本
  • 如果这些
    [DataContract]
    /
    [DataMember]
    属性是
    系统运行时序列化.dll
    属性,或者是您自己的属性(如果这是一个奇怪的问题,请抱歉)
要完整地回答这个问题:如果您没有任何属性(并且您拥有的属性很好),您还可以:

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

PropertyA
配置为键1,将
PropertyB
配置为键2。

感谢您的快速响应!我使用相同的版本。我的
RuntimeTypeModel.Default.Add(typeof(MyEntity),…)
中的第二个参数实际上是
false
。无论是使用
true
还是根本不使用该调用,我都会得到与您相同的结果。@Mike啊,对;是的,
false
表示“不查看属性”,包括不查看
DataMember(Order=n)
属性。如果您通过了
false
,您需要手动配置它-这就是我在上面的最后一个示例中所做的。如果您想使用
DataMember(Order=n)
属性:顺便说一句,说一下
true
,最好有这些
。添加(1,“PropertyA”)
部分以接受表达式作为强类型和编译器检查的第二个参数:)这将便于处理非属性类型。@Mike well,您可以随时添加扩展方法;我故意限制了依赖关系——如果您想要WCF支持,它目前只使用2.0和3.0;见鬼,如果你真的想要,它甚至可以编译为.NET1.1。仅仅为
表达式添加3.5依赖项似乎有点过火了。完全有道理。这个扩展对于我自己实现来说非常简单。
RuntimeTypeModel.Default.Add(typeof(MyEntity), false)
    .Add(1, "PropertyA")
    .Add(2, "PropertyB");