没有属性的Protobuf-net序列化
本文关键字:Protobuf-net 序列化 属性 | 更新日期: 2023-09-27 18:19:11
我有一个DataContracts程序集,我需要为它生成.proto模式,以便能够与java系统交换数据。可以更改DataContracts代码,但我不能在其中添加[ProtoContract]
和[ProtoMember]
属性,因为这会导致protobuf-net组件依赖。我们在系统的c#部分使用WCF,所以我们不希望在大多数不与java系统一起工作的c#项目中依赖于proto-buf汇编。
在protobuf-net网站的入门部分中说:
不喜欢属性?
在v2中,可以使用属性完成的所有操作也可以在运行时通过RuntimeTypeModel进行配置。
然而,我不知道如何实际配置没有属性的序列化,我没有看到任何这样的例子。
I'm try to do
[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 {
}
澄清:这个答案大部分与编辑前的问题有关,其中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。