Protobuf-net - сериализация только нескольких свойств - PullRequest
2 голосов
/ 18 августа 2011

Можно ли сериализовать только несколько свойств класса?Например:

public class Client
{
   [ProtoMember(1)]
   public int Id { get; set; } 

   [ProtoMember(2)]
   public string Name { get; set; }

   public int Age { get; set; } 

   [ProtoMember(3)]
   public string Guid { get; set; } 
}

Таким образом, я получаю неверное значение «Id».Другие свойства верны.Если я заполню все свойства «[ProtoMember]», значение «id» будет правильным.Почему?


На самом деле ошибка вызвана другими причинами, по которым вы можете мне помочь.

Я конвертирую String в Stream для выполнения задач.Во время обратного преобразования я имею ошибку в значении Id


var cli = new Client
{ Id = 222, Guid = "52369-fe5r6-74e2g-j1i4e", Age = 29, Name = "José"};

//Serialize
var ms = new MemoryStream();
Serializer.Serialize(ms, cli);
ms.Position = 0;
var reader = new StreamReader(ms);
var strStream = reader.ReadToEnd();

//Deserialize
var ms2 = new MemoryStream(Encoding.UTF8.GetBytes(strStream));


var obj = Serializer.Deserialize<Client>(ms2);

Таким образом, любое значение выше 127 преобразуется в другой Int.Пример: 3104751

Мое преобразование неверно?

Obs: Извините, плохой английский

Ответы [ 3 ]

2 голосов
/ 19 августа 2011

С вашим редактированием ошибка очевидна;вы используете Encoding для обработки произвольных данных в строку.Не волнуйтесь, я вижу это много (отсюда это сообщение ).

Цель кодировки текста:

string     =>      byte[]     =>     string
        (encode)           (decode)

здесь важно то, что byte[] имеет особую важность, определяемую кодировкой.То, что вы хотите, это base-64:

byte[]     =>      string     =>     byte[]
        (encode)           (decode)

, который вы делаете через:

byte[] raw = ms.ToArray();
string s = Convert.ToBase64String(raw);

, а затем:

byte[] bytes = Convert.FromBase64String(s);
2 голосов
/ 18 августа 2011

Это так.Просто убедитесь, что для класса включен атрибут [ProtoContract] и используется тот же контракт при сериализации и десериализации.

1 голос
/ 19 августа 2011

Проблема из-за кодировки. Почему вы читаете поток, а затем создаете другой? Примерно так должно работать:

var cli = new Client{ Id = 222, Guid = "52369-fe5r6-74e2g-j1i4e", Age = 29, Name = "José"};

//Serialize
var ms = new MemoryStream();
Serializer.Serialize(ms, cli);
ms.Position = 0;

//Deserialize
var obj = Serializer.Deserialize<Client>(ms);
...