我有一个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 {
}
答案 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(...)
行,也会得到完全相同的结果。
我不清楚为什么你会看到不同的东西 - 你能澄清一下:
[DataContract]
/ [DataMember]
属性是System.Runtime.Serialization.dll
属性,或属于您自己的属性(对不起,如果这似乎是一个奇怪的问题)要完全回答这个问题:如果你没有任何属性(并且你拥有的属性也没关系),你也可以这样做:
RuntimeTypeModel.Default.Add(typeof(MyEntity), false)
.Add(1, "PropertyA")
.Add(2, "PropertyB");
将PropertyA
配置为键1,将PropertyB
配置为键2。