[英]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.