当前位置: 首页 > 知识库问答 >
问题:

我怎么能持久化一个数组的一个null值在原型网?

车胤运
2023-03-14

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

然而,我遇到的一个问题是,这是双重的吗?[]数组的反序列化形式与序列化的形式不同。数组中的任何null值都会被整体删除,即如果我从一个包含6个元素的数组开始[null,null,1,2,3,null],反序列化后,我最终会得到一个数组[1,2,3]。对于我的程序,我必须以序列化之前完全相同的形式检索这些数组,就像使用BinaryFormatter一样。

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

我可以在前面的相关问题中看到,ProtoMember可能有一个“SupportNull”选项,但我找不到任何文档清楚地说明如何实现这一点,我自己也无法通过玩来解决这个问题。

任何人能提供的任何帮助都将不胜感激。

共有2个答案

仇建茗
2023-03-14

它实际上不支持开箱即用,您必须操作RuntimeTypeModel来显式设置它应该允许null。

运行时类型模型。默认[类型(YourObjectType)][(标记)]。SupportNull=真

例子:

var nullable = new ObjectWithNullables() { IntArray = new int?[] { null, 1, 2, null } };

// returns 2 elements out of 4
//var resultA = Deserialize<ObjectWithNullables>(Serialize<ObjectWithNullables>(nullable));

RuntimeTypeModel.Default[typeof(ObjectWithNullables)][1].SupportNull = true;

// returns 4 elements out of 4
var resultA = Deserialize<ObjectWithNullables>(Serialize<ObjectWithNullables>(nullable));


    [ProtoContract]
    public class ObjectWithNullables
    {
        [ProtoMember(1)]
        public int?[] IntArray { get; set; }
    }
狄宜然
2023-03-14
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);
        }
    }
}
 类似资料:
  • 我要“登录” 而我愿意这样 我也使用Bootstrap4,但不是为了我想做的事情,我在某个地方读到,不使用Bootstrap,自己做更好。 下面是我使用的代码: css: html: 如果可以使用Bootstrap 4完成,我也可以。

  • 问题内容: 我无法理解为什么Java迫使我将()声明为final。这是为什么? 问题答案: 这是一个内部类,传递给它-内部类外部引用的所有变量都需要声明为final才能在内部类中使用。这是因为本地类实例必须维护变量的单独副本,因为它可能会使函数失效。为了避免在相同范围内混淆两个具有相同名称的可修改变量,该变量被强制为不可修改。 只需在调用使用内部类的方法之前执行,然后在内部使用即可。

  • 我是新的java.here是我的代码。我确定我的字符串数组大小与nextint metod使用扫描仪。然后我添加了字符串与nextline metod.它似乎对我是正确的,但我不能看到我的第一个值的数组.这是什么问题在这个代码。

  • 我正在尝试使用urllib.urlencode对python中的词典进行urlencode编码。问题是,我必须对数组进行编码。 结果必须是: 但我得到的结果是: 我试过几种方法,但似乎没有得到正确的结果。 如果我使用对正确的查询字符串进行解码,结果如下: 但是如果我对结果进行编码,我会得到一个错误的结果。有没有办法产生预期的结果?

  • < b >想改进这个问题?通过编辑此帖子添加详细信息并澄清问题。 我如何用div制作所谓的面具。你好,我正在寻找解决我问题的方法,如果有人能帮助我,我会非常感激。我希望你只能通过div看到背景。如果有人能帮助我,我会非常感激。非常感谢。亚历克斯。

  • 我想将表单域映射到数据库域。 我有两个数组。。 一个数组是数据,包含作为键的表单字段id和作为值的表单字段值。 我还有一个数组,打算用作地图。此数组的键与表单字段相同,值为数据库字段名。 我想做的是遍历数据数组,在数据键与映射键匹配的地方,给数据数组分配一个新的键,这个键就是映射数组的值。 我的问题是怎么做?我尝试了很多不同的方法,现在我完全迷失在其中。