使用 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 本身不会尝试跟踪更改。
有没有一种方法可以使用 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 本身不会尝试跟踪更改。