Protocol buffers 将PrefixStyle切换到Fixed32后反序列化失败

Protocol buffers 将PrefixStyle切换到Fixed32后反序列化失败,protocol-buffers,protobuf-net,Protocol Buffers,Protobuf Net,我有一个通信库的测试套件,我正在使用运行正常的protobuf-net开发。所有测试都通过了。但是如果我将PrefixStyle从Base128更改为Fixed32,反序列化就会失败 我从TryDeserializeWithLengthPrefix函数收到的异常是: 捕获到System.ArgumentNullException Message=“值不能为空。\r\n参数名称:类型” Source=“protobuf net” ParamName=“type” 如果我在序列化和反序列化消息时

我有一个通信库的测试套件,我正在使用运行正常的
protobuf-net
开发。所有测试都通过了。但是如果我将PrefixStyle从Base128更改为Fixed32,反序列化就会失败

我从
TryDeserializeWithLengthPrefix
函数收到的异常是:


捕获到System.ArgumentNullException
Message=“值不能为空。\r\n参数名称:类型”
Source=“protobuf net”
ParamName=“type”

如果我在序列化和反序列化消息时只保留PrefixStyle.Base128,那么一切都会正常工作


有人知道会发生什么吗?

嗯,是的,看起来像个虫子();下面是一个可重复的例子。我看看能不能(很快)在火车上修好。很抱歉:

using System;
using System.IO;
using ProtoBuf;
[ProtoContract]
public class Strange // test entity
{
    [ProtoMember(1)]
    public string Foo { get; set; } // test prop
    [ProtoMember(2)]
    public int Bar { get; set; } // test prop

    static void Main() {
        var original = new Strange { Foo = "abc", Bar = 123 };
        // serialize and deserialize with base-128
        using (MemoryStream ms = new MemoryStream()) {
            Serializer.SerializeWithLengthPrefix(ms, original, PrefixStyle.Base128,1);
            ms.Position = 0;
            object obj;
            Serializer.NonGeneric.TryDeserializeWithLengthPrefix(ms,
                PrefixStyle.Base128, i => typeof(Strange),out obj);
            var clone = (Strange)obj;
            Console.WriteLine("Foo via Base128: " + clone.Foo); // works fine
            Console.WriteLine("Bar via Base128: " + clone.Bar);
        }
        // serialize and deserialize with fixed-32
        using (MemoryStream ms = new MemoryStream())
        {
            Serializer.SerializeWithLengthPrefix(ms, original, PrefixStyle.Fixed32,1);
            ms.Position = 0;
            object obj;
            // BOOM here; oh how embarrassing
            Serializer.NonGeneric.TryDeserializeWithLengthPrefix(ms,
                PrefixStyle.Fixed32, i => typeof(Strange), out obj);
            var clone = (Strange)obj;
            Console.WriteLine("Foo via Fixed32: " + clone.Foo);
            Console.WriteLine("Bar via Fixed32: " + clone.Bar);
        }
    }
}

可以我会等待反馈。祝你好运;-)我可以跟Base128一起,但是我在另一个问题上告诉过你,我的同事需要在C++中实现它,正如你所说的,如果我们使用FixEd32,对他来说会比较容易。我看了一下源代码,注意到FixEd32前缀样式不支持TAG参数。我使用这个参数来标识消息,所以Fixed32对我来说不是一个好的选择;我早些时候看了这一点,得出了同样的结论;我回来发布最新消息,但工作时间被打断了。我们没有理由不能在Fixed32中包含标记信息——事实上,从代码的角度来看,省略它似乎很奇怪——但目前使用base-128要简单得多-P翻译起来不是很难,尤其是C++。如果你真的想要Fixed32的前缀版本,这并不是很棘手,但这是一个改变;而且没有那么昂贵(每个实体8字节)。
using System;
using System.IO;
using ProtoBuf;
[ProtoContract]
public class Strange // test entity
{
    [ProtoMember(1)]
    public string Foo { get; set; } // test prop
    [ProtoMember(2)]
    public int Bar { get; set; } // test prop

    static void Main() {
        var original = new Strange { Foo = "abc", Bar = 123 };
        // serialize and deserialize with base-128
        using (MemoryStream ms = new MemoryStream()) {
            Serializer.SerializeWithLengthPrefix(ms, original, PrefixStyle.Base128,1);
            ms.Position = 0;
            object obj;
            Serializer.NonGeneric.TryDeserializeWithLengthPrefix(ms,
                PrefixStyle.Base128, i => typeof(Strange),out obj);
            var clone = (Strange)obj;
            Console.WriteLine("Foo via Base128: " + clone.Foo); // works fine
            Console.WriteLine("Bar via Base128: " + clone.Bar);
        }
        // serialize and deserialize with fixed-32
        using (MemoryStream ms = new MemoryStream())
        {
            Serializer.SerializeWithLengthPrefix(ms, original, PrefixStyle.Fixed32,1);
            ms.Position = 0;
            object obj;
            // BOOM here; oh how embarrassing
            Serializer.NonGeneric.TryDeserializeWithLengthPrefix(ms,
                PrefixStyle.Fixed32, i => typeof(Strange), out obj);
            var clone = (Strange)obj;
            Console.WriteLine("Foo via Fixed32: " + clone.Foo);
            Console.WriteLine("Bar via Fixed32: " + clone.Bar);
        }
    }
}