我正在使用protobuf-net的序列化库,我的团队遇到了一个有趣的用例。在我们的应用程序中,我们将字节数组反序列化到现有实例上。现有实例具有属性,有些可以为空,有些则不属于。我面临的问题是,如果现有实例上的可空属性具有值,但刚刚通过线路接收的序列化实例没有该属性的值。由于协议缓冲区没有null的概念,因此null不会被序列化到字节数组中,因此反序列化调用不会用null覆盖可空属性。
如果您无法遵循,我会写一个快速的单元测试来说明我的观点/问题:
[TestFixture]
public class WhenSerializingNullableProperties
{
private RuntimeTypeModel _runtimeTypeModel;
[TestFixtureSetUp]
public void FixtureSetup()
{
_runtimeTypeModel = TypeModel.Create();
_runtimeTypeModel.Add(typeof (Foo), false).Add("Id", "Name");
}
internal class Foo
{
public string Name { get; set; }
public int? Id { get; set; }
}
[Test]
public void ShouldSetNullablePropertiesToNull()
{
var foo = new Foo { Name = "name", Id = null };
byte[] serialized;
using (var stream = new MemoryStream())
{
_runtimeTypeModel.Serialize(stream, security);
serialized = stream.ToArray();
}
foo.Id = 18;
foo.Name = "other";
using (var stream = new MemoryStream(serialized))
{
_runtimeTypeModel.Deserialize(stream, foo, typeof(Foo));
}
foo.Name.Should().Be("name"); // this PASSES
foo.Id.Should().NotHaveValue(); // this FAILS
}
}
我理解(并且很感激)protobuf的紧凑性,不包括空值。我不想输入默认值并让我的流更大。相反,我正在寻找protobuf-net,如果它不被包含在被反序列化的流中,则将可空属性设置为null。
提前感谢您提供的所有帮助。