我在C#中使用protobuf-net r278,我只是注意到如果我有一个带有int
字段的类,如果该字段的值设置为0,则该字段不会被正确反序列化。即,反序列化时,它从类定义中获取其默认值。示例类:
[ProtoBuf.ProtoContract]
public class
Test
{
[ProtoBuf.ProtoMember(1)]
public int Field1 = -1
[ProtoBuf.ProtoMember(2)]
public int Field2 = -1;
}
然后运行此代码:
var test = new Test();
test.Field1 = 0;
test.Field2 = 0;
MemoryStream ms_out = new MemoryStream();
ProtoBuf.Serializer.Serialize(ms_out, test);
ms_out.Seek(0, SeekOrigin.Begin);
var deser = ProtoBuf.Serializer.Deserialize<Test>(ms_out);
当我这样做时,deser
有Field1 = -1
和Field2 = 2
,而不是0。我在这里做错了吗?
答案 0 :(得分:5)
与wire-spec一致,有一个隐含的零默认值(可以使用[DefaultValue(...)]
更改为其他值。您可以通过设置IsRequired = true
来告诉它自己的行为。属性:
[ProtoBuf.ProtoMember(1, IsRequired = true)]