我正在使用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 = ""
答案 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 ?? "");}
}
}