【问题标题】:protobuf-net serialization without attributes没有属性的protobuf-net序列化
【发布时间】:2013-06-16 14:20:20
【问题描述】:

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

【问题讨论】:

    标签: c# protobuf-net


    【解决方案1】:

    澄清:这个答案的大部分与预编辑问题有关,其中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。

    【讨论】:

    • 感谢您的快速回复!我使用相同的版本。我的RuntimeTypeModel.Default.Add(typeof(MyEntity), ...) 中的第二个参数实际上是false。使用true 或根本不使用该调用,我得到的结果与您相同。
    • @Mike 啊,对;是的,false 的意思是“不看属性”,包括不看DataMember(Order=n) 属性。如果通过false,则需要手动进行配置——这就是我在上面最后一个示例中所做的。如果你想使用DataMember(Order=n) 属性:说true
    • 顺便说一句,最好让那些.Add(1, "PropertyA") 部分接受 Expression 作为强类型和编译器检查的第二个参数:) 这将简化非属性类型的工作。
    • @Mike 好吧,你总是可以添加一个扩展方法;我故意限制了依赖关系——如果你想要 WCF 支持,它目前只使用 2.0 和 3.0;哎呀,如果你真的想要,它甚至可以为 .NET 1.1 编译。为Expression 添加一个3.5 的依赖just 似乎有点矫枉过正。
    • 完全有道理。这个扩展对于我自己来说非常简单。
    猜你喜欢
    • 2015-09-10
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2011-12-04
    • 2011-10-03
    • 2012-04-20
    • 1970-01-01
    相关资源
    最近更新 更多