17

我有一个带有 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 {
}
4

1 回答 1

14

澄清:这个答案的大部分与预编辑问题有关,false传递给RuntimeTypeModel.Add(...)


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

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。

于 2013-06-19T21:29:49.357 回答