【问题标题】:PortoBuf-net Deserializes a double-sized version of the serialized double arrayPortoBuf-net 反序列化一个双倍大小版本的序列化双精度数组
【发布时间】:2013-04-22 18:43:25
【问题描述】:
[Serializable]
[ProtoContract]
public class DataWrapper
{
    [ProtoMember(1)]
    public double[] Data = new double[] { 1, 2, 3, 4 };
}

class Program
{
    static void Main(string[] args)
    {

        Dictionary<int, DataWrapper> serialized = new Dictionary<int, DataWrapper>();
        Dictionary<int, DataWrapper> deserialized;// = new Dictionary<int, OHLC>();
        for (int i = 0; i < 10; i++)
        {
            serialized.Add(i, new DataWrapper());                
        }
        using (FileStream ms = new FileStream("dictionary", FileMode.Create, FileAccess.Write))
        {
            Serializer.Serialize<Dictionary<int, DataWrapper>>(ms, serialized);
        }


        using (FileStream ms = new FileStream("dictionary", FileMode.Open, FileAccess.Read))
        {
            deserialized = Serializer.Deserialize<Dictionary<int, DataWrapper>>(ms);
        }

        Console.WriteLine("serialized {0} and deserialized {1}", serialized[0].Data.Length, deserialized[0].Data.Length);

        }
}

我希望反序列化一个长度为 4 的数组,而我收到一个长度为 8 的数组。这是一个错误,还是我在这里做错了?

请注意,代码是没有意义的。这只是试图解释我在真实场景中面临的问题

【问题讨论】:

  • DLL 版本为 2.0.0.622

标签: c# serialization deserialization


【解决方案1】:

我不是 Protobuf-net 专家,但这似乎与 this issue 有关。我怀疑这是因为您明确地将double[] 初始化为具有 4 个元素,并且 protobuf-net 在反序列化期间“附加”了额外的 4 个元素。

作为一种解决方法,您可以在ProtoContract 中设置SkipConstructor=true 选项,然后它会按预期工作:

[ProtoContract(SkipConstructor=true)]

【讨论】:

  • [ProtoMember(1, OverwriteList = true)] 也可以完成这项工作。看起来这不是一个错误,而是一个设计决定,因为 Protobuf 规范说如果数组不为空,则应该附加。这对于 C# 来说并不太“惯用”,因为改变数组大小通常被认为是不好的做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-20
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
相关资源
最近更新 更多