【问题标题】:UseImplicitZeroDefaults for generated protobuf classesUseImplicitZeroDefaults 用于生成的 protobuf 类
【发布时间】:2013-03-12 03:21:02
【问题描述】:

UseImplicitZeroDefaults = false 时,使用 protogen 生成的类的默认值似乎没有被序列化。

我有一个小的 .proto 文件:

package protobuf;

option java_package = "com.company.protobuf";
option java_outer_classname = "Test";

message TestMessage{        
    optional string Message = 1;
    optional bool ABool = 2;
    optional int32 AnInt = 3;           
}

使用 protogen.exe,我生成了一个 TestMessage 类,我试图通过网络来回发送到 Java 应用程序。我似乎无法让 protobuf-net 序列化 AnInt 的零值或 ABool 的 false,包括设置 UseImplicitZeroDefaults=false。但是,使用带有该设置的带注释的类进行序列化是可行的。这是与我生成的类等效的类:

[ProtoContract]
class Test2
{
    [ProtoMember(1)]
    public string Message { get; set; }
    [ProtoMember(2)]
    public bool ABool { get; set; }
    [ProtoMember(3)]
    public int AnInt { get; set; }
}

用相同的数据初始化两个类并序列化为byte[] 表明有四个额外的字节来自带注释的类。

...
private static readonly RuntimeTypeModel serializer;
static Program()
{
    serializer = TypeModel.Create();
    serializer.UseImplicitZeroDefaults = false;
    Console.WriteLine(serializer.UseImplicitZeroDefaults); //prints false 
}

static void SendMessages(ITopic topic, ISession session)
{
    Console.WriteLine(serializer.UseImplicitZeroDefaults);

    TestMessage t = new TestMessage();
    t.ABool = false;
    t.AnInt = 0;
    t.Message = "Test Message";

    using (var o = new MemoryStream())
    {
        serializer.Serialize(o, t);
        Console.WriteLine(string.Format("Tx: Message={0} ABool={1} AnInt={2}", t.Message, t.ABool, t.AnInt));
        Console.WriteLine(o.ToArray().Length);
    }

    Test2 t2 = new Test2();
    t2.ABool = false;
    t2.AnInt = 0;
    t2.Message = "Test Message";
    using (var o = new MemoryStream())
    {
        serializer.Serialize(o, t2);
        Console.WriteLine(string.Format("Tx: Message={0} ABool={1} AnInt={2}", t.Message, t.ABool, t.AnInt));
        Console.WriteLine(o.ToArray().Length);
    }
}

输出:

False
Tx: Message=Test Message ABool=False AnInt=0
14
Tx: Message=Test Message ABool=False AnInt=0
18

有没有我缺少的设置?还是从 .proto 文件生成的类使用不同的序列化机制?在理想情况下,我希望 UseImplicitZeroDefaults 设置在通过序列化程序的过程中被带注释的类和生成的类都拾取。

【问题讨论】:

    标签: c# protobuf-net


    【解决方案1】:

    如果您将-p:detectMissing 添加到对protogen 的调用中,它应该按照不同的模式发出代码,以便更好地跟踪这些代码。基本上,它应该做你想做的事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-26
      • 2021-02-08
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 2020-01-01
      • 2018-09-20
      • 2012-06-29
      相关资源
      最近更新 更多