【问题标题】:Collections wont serialise with protobuf-net?集合不会用 protobuf-net 序列化吗?
【发布时间】:2014-06-13 10:51:33
【问题描述】:

我正在评估 Protobuf-net 以加速 WCF 项目,到目前为止它看起来很有希望,但我遇到了一个问题,即列表(和字典)在客户端显示为空。

编辑 这个问题被证明是错误的,问题在于空集合与内容无关。我正在更新它,以便任何偶然发现它的人都可以得到一些帮助。 编辑

这是(简化的)代码

    [ProtoContract]
    public class TestObject
    {
        [ProtoMember(1)]
        public List<int> Values { get; set; }
    }

    public Test()
    {

        TestObject bob = new TestObject() { Values = new List<int>() };
        using (MemoryStream stream = new MemoryStream())
        {
            Serializer.Serialize<TestObject>(stream, bob);

            stream.Seek(0, SeekOrigin.Begin);

            TestObject copy = Serializer.Deserialize<TestObject>(stream);

            // Fail!
            Debug.Assert(copy.Values != null);
        }
    }

当我查看副本中的值时,它是 null 而不是空的 List 对象。

任何想法我可能做错了什么?我正在使用 protobuf-net full 2.0.0.668

谢谢, 标记

【问题讨论】:

  • 稍后我将不得不对此进行研究;正在工作
  • 非常感谢,实际上 struct 的东西可能是一个红鲱鱼,另一个不起作用的集合是类对象的字典。我只是在寻找一种模式。
  • 我找到了问题所在。它与结构和类无关。如果集合为空,则在反序列化对象上得到 null,而不是初始化但为空的集合。即使在非常简单的测试工具上也会发生这种情况。
  • 如果集合为空,我有点困惑我们在谈论什么对象;希望看到一个小而完整的例子。
  • 我即将更新问题并回答它。基本上它与 google-code 项目中的 issue 58 和 131 相同。空集合反序列化为 null。看起来这就是它必须的方式,但如果我们迁移它会让我们非常头疼。也许我们可以添加一个属性来始终创建一个空集合并且永远不会为空?

标签: protobuf-net


【解决方案1】:

原来这是 protobuf 的行为,因为底层标准没有区分空列表和空列表。

查看项目网站上的问题58131

对于从 DataContract 尤其是使用 WCF 迁移的任何人来说,这将是一个相当大的惊喜。

可能的解决方法包括内联初始化,或在构造函数中初始化,或更改您的代码以接受 null 或像这样在之后对其进行修补。

    [ProtoAfterDeserialization]
    public void Fix()
    {
        Values = Values ?? new List<int>(0);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多