与protobuf-net反序列化时的数组不匹配

本文关键字:数组 不匹配 protobuf-net 反序列化 | 更新日期: 2023-09-27 18:01:08

我是protobuf-net的完全初学者,所以这可能只是一些愚蠢的初学者错误。但我找不到这个有什么问题:

我有一个要序列化到磁盘的类,定义如下:

[ProtoContract]
public class SerializableFactors
{
    [ProtoMember(1)]
    public double?[] CaF {get;set;}
    [ProtoMember(2)]
    public byte?[] CoF { get; set; }
}

和这样定义的测试:

        if (File.Exists("factors.bin"))
        {
            using (FileStream file = File.OpenRead("factors.bin"))
            {
                _factors = Serializer.Deserialize<SerializableFactors>(file);
            }
        }
        else
        {
            _factors = new SerializableFactors();
            _factors.CaF = new double?[24];
            _factors.CaF[8] = 7.5;
            _factors.CaF[12] = 1;
            _factors.CaF[18] = 1.5;
            _factors.CoF = new byte?[24];
            _factors.CoF[8] = 15;
            _factors.CoF[12] = 45;
            _factors.CoF[18] = 25;
            using (FileStream file = File.Create("factors.bin"))
            {
                Serializer.Serialize(file, _factors);
            }
        }

因此,基本上,如果文件还不存在,我会创建一个具有默认值的对象,并将其序列化到磁盘。如果文件存在,我将把它加载到内存中。

但对我来说,加载文件的结果并不是我在保存到磁盘之前创建的。我创建了长度为24的数组,这些数组的值在槽8、12和18中。但反序列化的对象具有长度为3的数组,其中包含我的值。

我在这里犯了什么错?提前感谢!

与protobuf-net反序列化时的数组不匹配

您必须将RuntimeTypeModel设置为支持空

请参阅以下帖子:如何在Protobuf-Net中持久化一个可为null值的数组?

// configure the model; SupportNull is not currently available
// on the attributes, so need to tweak the model a little
RuntimeTypeModel.Default.Add(typeof(SerializableFactors), true)[1].SupportNull = true;
if (File.Exists("factors.bin"))
{
   using (FileStream file = File.OpenRead("factors.bin"))
   {
      _factors = Serializer.Deserialize<SerializableFactors>(file);
   }
}
else
{
   _factors = new SerializableFactors();
   _factors.CaF = new double?[24];
   _factors.CaF[8] = 7.5;
   _factors.CaF[12] = 1;
   _factors.CaF[18] = 1.5;
   _factors.CoF = new byte?[24];
   _factors.CoF[8] = 15;
   _factors.CoF[12] = 45;
   _factors.CoF[18] = 25;
   using (FileStream file = File.Create("factors.bin"))
   {
     Serializer.Serialize(file, _factors);
   }
}