gpt4 book ai didi

protobuf-net - 使用 protobuf-net 时将空字符串反序列化为空字符串

转载 作者:行者123 更新时间:2023-12-01 13:06:31 26 4
gpt4 key购买 nike

我正在使用 protobuf-net 来序列化和反序列化我的消息。我的消息还包含可以为空的字符串。但是,当我在另一侧反序列化它们时,我得到空字符串 ("")。

根据谷歌文档,空字符串中字符串类型的默认值。
这个问题的解决方案是什么?

这是我正在使用的代码:

Command message = new Command();
message.s_value = null;
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize<Command>(stream, message);
stream.Close();
}

反序列化同一个流后,我得到 s_value = ""

最佳答案

我猜你的类型在无参数构造函数中将字符串显式设置为“”。你能查一下吗?

protobuf-net 处理这个的方式是:

  • 对于 null ,不发送任何内容(protobuf 线格式无法明确表示 null ,但我们可以将其视为可选并省略它)
  • 对于 "" ,发送一个长度为 0 的模式,应反序列化为 ""
  • 为非空字符串,发送长度和字符串,并反序列化

  • 在反序列化期间,在 null 的情况下,它只会让您的字段/属性单独存在,因为它没有要处理的数据。如果类型将默认值设置为 "" ,它将保持为 ""

    请注意,在“v2”(我预计将在接下来的两周内发布)中,您可以选择告诉它使用“不运行任何构造函数”的 WCF 方法,这甚至会导致将其保留为 null如果默认构造函数分配了它。

    您还可以执行一些技巧(使用“v1”)来发送 bool 标志(作为单独的属性)来表示 null ;如果你想要一个这样的例子,请告诉我。

    编辑:这是解决此问题的“v1”技巧示例;不过,“忽略构造函数”的“v2”方法可能是长期更好的选择:
    [DataContract]
    class Test {
    public Test() { Value = ""; } // a constructor that assigns the value

    [DataMember(Order = 1)]
    public string Value { get; set; } // our standard data
    [DataMember(Order = 2)]
    private bool ValueIsNull { // only exists to indicate explicit null
    get { return Value == null; }
    set { Value = value ? null : (Value ?? "");}
    }
    }

    关于protobuf-net - 使用 protobuf-net 时将空字符串反序列化为空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2743101/

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