使用 Protobuf-net 进行差异编码

Difference Encoding using Protobuf-net

有没有一种方法可以使用 Protobuf-net 序列化一个对象,这样像下面这样的调用将只更新 dataBlob 中发生变化的值?

var dataBlob = <previous values>;
testTypeModel.DeserializeWithLengthPrefix(stream, dataBlob, typeof(DataBlob), PrefixStyle.Base128, 0, null);

例如:

var dataBlob = new DataBlob { a = 6, b = "Hello World" }
var newDataBlob = new DataBlob { a = 6, b = null }

//Expected data on the wire
var wireBlob = new DataBlob { b = null };

DeserializeWithLengthPrefix(wireBlob, dataBlob, typeof(DataBlob), PrefixStyle.Base128, 0, null);

Assert.AreEqual(newBlob, dataBlob);

如果您可以跟踪哪些字段已更改:当然,您可以使用条件序列化来实现此目的。最基本的方法是,对于 属性 Foo,提供一个 bool ShouldSerializeFoo() 方法(protobuf-net 支持的预先存在的约定)。 Merge / Deserialize 方法(取决于使用的 API )支持传入预先存在的实例。

请注意,列表始终是相加的。

但是,protobuf-net 本身不会尝试跟踪更改。