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