2

我在 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);

当我这样做时,deserField1 = -1Field2 = 2,而不是 0。我在这里做错了吗?

4

1 回答 1

5

根据电线规范,有一个隐含的零默认值(可以使用 更改为其他值。您可以通过在属性中[DefaultValue(...)]设置来告诉它按照您的意愿行事:IsRequired = true

[ProtoBuf.ProtoMember(1, IsRequired = true)]
于 2010-03-05T19:25:14.203 回答