【问题标题】:Protobuf-net c# serialization/deserialization of list result in empty collectionProtobuf-net c#序列化/反序列化列表导致空集合
【发布时间】:2018-08-13 09:41:58
【问题描述】:

我正在尝试序列化和反序列化 List<T>

最终目标是为 API 序列化对象/对象列表。

Protobuf-net 2.3.17(撰写本文时的最后一个)

经过一些阅读,我还没有解决这个问题。 这是我用于测试的简单代码,但也用于我的序列化/反序列化类:

using (var stream = new MemoryStream())
   {
      Serializer.Serialize(stream, data);
      var x = stream.ToArray();

      using (var stream2 = new MemoryStream(x))
        {
          var r = Serializer.Deserialize<List<Host>>(stream);
        }
    }

数据是List&lt;Host&gt;(150~ 个元素)

host 是一个简单的类:

[Serializable]
[ProtoContract(ImplicitFields = ImplicitFields.AllPublic, SkipConstructor = true)]
    public class Host
    {
        public Guid GidHost { get; set; }
        public int IdA { get; set; }
        public string HostName { get; set; }
        public string Description { get; set; }

        [DefaultValue(StatusEnum.Undefined)]
        public HostStatusEnum Status { get; set; }

        public string Address { get; set; }
        ecc.. (some other public primitive variables)

       [Serializable]
       public enum StatusEnum
       {
           Undefined = 0,
           Ok = 1,
           Offline = 2
       }
}

虽然 x(我猜)被正确序列化(x 包含 33000 字节) r 是一个包含 0 个元素的集合。

怎么了,我错过了什么?

谢谢

【问题讨论】:

  • 您在反序列化时使用的是流,而不是流2。所以内存流的位置大概是在最后……寻找到开头。

标签: c# protobuf-net


【解决方案1】:

这里:

using (var stream2 = new MemoryStream(x))
{
  var r = Serializer.Deserialize<List<Host>>(stream);
}

您正在反序列化来自 stream,而不是 stream2stream 当前位于末尾,因此实际上有 0 个字节可供读取。 0 字节实际上是完全有效的 protobuf,在这种情况下将表示一个空列表。

选项:

  • stream2反序列化
  • 倒带stream
  • 使用Serializer.DeepClone

在这种情况下,我建议使用最后一个选项,因为它可以避免额外的数组分配。从 3.0 开始,DeepClone 还可以选择不同的序列化存储策略(StreamPipe 等)以最适合您的平台 - 所以:在 .NET Core 2.1 上,它可能更喜欢使用 Pipe 并利用“跨度”等等

var r = Serializer.DeepClone(data);

【讨论】:

    【解决方案2】:

    你试过 r 和 stream2 吗?

    【讨论】:

    • 这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review
    • 我要取消删除它,因为尽管审查队列标记了它:它是绝对正确和有效的。有时一个简洁的答案是正确的。不过对@schen993 的建议:尝试更明确地表达您的意思。你在这里是 100%,但并不明显。
    • @MarcGravell 感谢您取消删除......并且只是试图“回答问题”......每个人(我不是说你)都非常专注于放弃其他人的帖子 - “回答问题”发生了什么? “这没有提供问题的答案” - 这是否回答了问题? AeonDave,如果解决了您的问题,请标记为答案
    • @schen993 我认为,如果您再添加几句话来解释为什么这是一个问题,那么它会受到非常积极的欢迎。
    • 嘿!我先贴出答案!
    猜你喜欢
    • 2012-04-26
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    相关资源
    最近更新 更多