簡體   English   中英

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,但仍然讓客戶端僅反序列化 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之類的東西(其中包括數據中的消息名稱),否則應該沒問題。 消息的名稱通常不是協議緩沖區中序列化的數據的一部分。 (並且它可能在不同的語言之間有所不同,或者在不同的 package 等中)

我不知道 protobuf-net 對未知字段做了什么,但在 Google.Protobuf 中,即使存在生成時不知道標簽號的字段,反序列化過程也會成功。 (根據使用的版本,未知字段值可能會或可能不會保留以供以后序列化。當這些只是普通用戶類時,我不希望 protobuf-net 保留值。)這是您可能想要測試的東西,因此,如果您確實將任何新字段添加到Bar並使用這些字段序列化數據, Foo -only 客戶端仍然能夠反序列化。 (不過,您需要考慮數據丟失的影響。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM