在我没有注意到这一点之前,我不确定这个问题是否是错误,或者只是这个。
我创建一个Document
类并声明 protobuf-net 限制。
[ProtoContract]
public class Document
{
[ProtoMember(1)]
private Dictionary<string,string> _items;
[ProtoMember(2)]
public int DocNumber
{
get;
set;
}
public Document()
{
this.DocNumber = -1;
this._items = new Dictionary<string,string>();
}
public byte[] Serialize()
{
byte[] bytes = null;
using (var ms = new MemoryStream())
{
Serializer.Serialize(ms, this);
bytes = ms.ToArray();
ms.Close();
}
return bytes;
}
public static Document Deserialize(byte[] bytes)
{
Document obj = null;
using (var ms = new MemoryStream(bytes))
{
obj = Serializer.Deserialize<Document>(ms);
ms.Close();
}
return obj;
}
}
在测试代码中:
var doc = new Document();
doc.DocNumber = 0;
var bytes = doc.Serialize();
var new_doc = Document.Deserialize(bytes);
Console.WriteLine(new_doc.DocNumber + " vs " + doc.DocNumber);
输出消息是:-1 vs 0
.我不敢相信这个结果(正确的结果是0 vs 0
),所以我改变了doc.DocNumber = 0
to doc.DocNumber = 1
,
输出是正确的:1 vs 1
.
这个问题意味着我无法将零分配给DocNumber
属性,在Document i的构造方法中必须声明DocNumber属性为-1。
有人可以帮助我吗?这个问题是我的原因还是protobuf-net的原因?谢谢。
默认情况下。它假定零值作为默认值。我对这个设计选择感到遗憾,因此可以在 v2 中禁用它,但为了兼容性而保留。在 v1 和 v2 中,您也可以简单地告诉它 -1 是默认值:
[ProtoMember(2), DefaultValue(-1)]
public int DocNumber
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)