Protobuf-net:更改消息名称

Protobuf-net: change name of message

我必须遵循以下场景:今天同一条消息用于两个不同的操作。这些操作开始时非常相似,但现在变得不同,因此消息应该有所区别。

那么,如何“拆分”消息并保持追溯兼容性?可能吗? 我是说,今天我有

[ProtoContract]
class Foo{ ... }

明天我要

[ProtoContract]
class Foo{ ... }

[ProtoContract]
class Bar{ /* Identical fields and ProtoMemeber as Foo, at least for now */ } 

并将它们序列化为 Foo 和 Bar,但仍然有 old 客户端仅反序列化 Foo:

var x = Serialize<Bar>(someBar);
//... send x to old client who does not know about Bar
var foo = Deserialize<Foo>(x); // deserialize correctly because fields are identical

可能吗? 我需要添加一些属性,还是做其他事情?


编辑:它似乎“正常工作”:

 static void Main(string[] args)
    {
        using (var stream = new MemoryStream())
        {
            var x = new Foo();
            x.AcquireTimeInLocalTime = DateTime.Now;
            x.Chans[23] = new SomeItem() { SomeString = "Ciao" };
            Serializer.SerializeWithLengthPrefix(stream, x, PrefixStyle.Base128);

            stream.Seek(0, SeekOrigin.Begin);

            var y = Serializer.DeserializeWithLengthPrefix<Bar>(stream, PrefixStyle.Base128);
            
            Console.WriteLine($"{y.AcquireTimeInLocalTime}, {y.Chans[23].SomeString}, {y.GetType().Name}");
        }
    }

版画

01/12/20 10:43:17, Ciao, Bar

这是我所期望的。但我会留下这个问题,因为我不确定这只是偶然的还是预期的(和支持的)行为。我正在寻找比实验更权威的答案。

除非您使用 google.protobuf.Any 之类的东西(其中包括数据中的消息名称),否则应该没问题。消息的名称 通常不是 在协议缓冲区中序列化的数据的一部分。 (并且它可能在不同的语言之间或在不同的包中等不同。)

我不知道 protobuf-net 对未知字段做了什么,但在 Google.Protobuf 内,即使存在带有在生成时未知的标记号的字段,反序列化过程也会成功。 (根据所使用的版本,未知字段值可能会或可能不会保留以供以后序列化。我不希望 protobuf-net 在这些只是普通用户 类 时保留值。)这可能是你想要测试,这样如果您 do 将任何新字段添加到 Bar 并使用这些字段序列化数据,仅 Foo 的客户端仍然能够反序列化. (不过,您需要考虑数据丢失的影响。)