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

时间:2010-04-30 08:03:25

标签: protobuf-net

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

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

以下是我正在使用的代码:

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

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

1 个答案:

答案 0 :(得分:4)

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

protobuf-net处理此问题的方式是:

  • 对于null没有被发送(protobuf有线格式无法明确表达null,但我们可以将其视为可选项并省略它)
  • 对于"",会发送一个0长度的模式,该模式应该反序列化为""
  • 对于非空字符串,将发送长度和字符串,并进行反序列化

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

请注意,在“v2”中(我希望在接下来的两周内发布),您可以选择让它使用“不运行任何构造函数”的WCF方法,这会产生离开它的效果as 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 ?? "");}
    }
}