protobuf-net:反序列化到实例上;将属性设置为null

时间:2014-04-09 19:51:54

标签: c# c#-4.0 serialization protocol-buffers protobuf-net

我正在使用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。

提前感谢您提供的所有帮助。

0 个答案:

没有答案