gpt4 book ai didi

c# - 为什么带有 protobuf 的 redis 将空数组保存为 null?

转载 作者:太空宇宙 更新时间:2023-11-03 11:58:16 26 4
gpt4 key购买 nike

我在 Redis 服务器 2.8.2103 上使用 protobuf-net 2.3.3 维护一个应用程序> 使用 StackExchange.Redis 1.2.6

对于像这样的对象:

[ProtoContract(ImplicitFields = ImplicitFields.AllFields)]
public class Cachable { Foo[] Foos { get; set; } }

当我使用简单的方式保存时:

using (var memoryStream = new MemoryStream())
{
Serializer.Serialize(memoryStream, cachable);
database.HashSetAsync("category", "key", memoryStream.ToArray());
}

然后检索:

var response = database.HashGet("category", "key");
if (!response.HasValue) return null;
using (var memoryStream = new MemoryStream(response, false))
{
return Serializer.Deserialize<Cachable>(memoryStream);
}

如果缓存数组 Foos 有一个空实例,如 new Foo[0],一旦 Cachable 被反序列化,数组将变为。这正在改变应用程序某些部分的行为并产生错误。
这种行为是预期的吗?有什么办法可以改变吗?

最佳答案

这里真正的问题是 Foo[0]null 吗?如果是这样:

  • protobuf 没有null的概念;它不能表示和存储 null,因此默认情况下 protobuf-net skips null 值,使它本质上是一个空数组
  • 有一点“空包装基元”的警告,protobuf 没有“空”序列的概念;在 .proto 术语中,您谈论的是一个元素为零的 repeated 字段,这意味着:它根本不存在于负载中根本
  • 并且如果它不存在于有效载荷中,它永远不会反序列化到任何东西 - 因为有效载荷中从来没有任何东西可以告诉它反序列化<

所以:

  • 避免 null 除非你的意思是一个可选的子元素;绝对避免在列表/数组等中使用 null
  • 不要假设空列表/数组/等将被库初始化为非空值

IMO,对于第二点,以下内容是合理且务实的:

Foo[] Foos { get; set; } = Array.Empty<Foo>();

(这避免了它初始化为 null 的问题)

关于c# - 为什么带有 protobuf 的 redis 将空数组保存为 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58482576/

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