Protobuf-сеть не десериализует 0 - PullRequest
2 голосов
/ 05 марта 2010

Я использую protobuf-net r278 в C #, и я только что заметил, что если у меня есть класс с полем 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. Я что-то здесь не так делаю?

1 Ответ

5 голосов
/ 05 марта 2010

В соответствии со спецификацией проводника существует неявное нулевое значение по умолчанию (которое может быть изменено на другие значения с помощью [DefaultValue(...)]. Вы можете указать, чтобы оно вело себя так, как вы хотите, установив IsRequired = true в атрибуте:

[ProtoBuf.ProtoMember(1, IsRequired = true)]
...