gpt4 book ai didi

c# - 如何在 Protobuf-Net 中保留一个可为空值的数组?

转载 作者:行者123 更新时间:2023-11-30 15:32:28 25 4
gpt4 key购买 nike

我正在从 BinaryFormatter 迁移到 Protobuf-net(到目前为止,它似乎在存储大小和反序列化时间方面都提供了巨大的改进)。

然而,我遇到的一个问题是 double?[] 数组不会以与序列化时相同的形式进行反序列化。数组中的任何 null 值都将被完全删除 - 即如果我从一个包含 6 个元素 [null, null, 1, 2, 3, null] 的数组开始,在反序列化之后我最终得到一个数组 [1 , 2, 3]。对于我的程序,我必须以与序列化之前完全相同的形式检索这些数组 - 如果使用 BinaryFormatter 就会发生这种情况。

到目前为止我想出的一个解决方案是为每个数组创建两个数组,一个是 double[] 其中每个元素都有一个值,另一个是 bool[] 可以用来描述原始值是否是null - 但是由于各种原因,这是非常低效的。

我可以看到在之前的相关问题中提到 ProtoMember 可能有一个“SupportNull”选项,但我找不到任何文档清楚地显示如何实现它,而且我自己也无法解决.

任何人都可以提供任何帮助,我们将不胜感激。

最佳答案

using ProtoBuf;
using ProtoBuf.Meta;
using System;
[ProtoContract]
class Foo
{
[ProtoMember(1)]
public double?[] Values { get; set; }
}
static class Program
{
static void Main()
{
// configure the model; SupportNull is not currently available
// on the attributes, so need to tweak the model a little
RuntimeTypeModel.Default.Add(typeof(Foo), true)[1].SupportNull = true;

// invent some data, then clone it (serialize+deserialize)
var obj = new Foo { Values = new double?[] {1,null, 2.5, null, 3}};
var clone = Serializer.DeepClone(obj);

// check we got all the values back
foreach (var value in clone.Values)
{
Console.WriteLine(value);
}
}
}

关于c# - 如何在 Protobuf-Net 中保留一个可为空值的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19112122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com