Поскольку другие могут захотеть узнать ответ на эти вопросы, я решил опубликовать вопрос и поделиться своими выводами.
На самом деле эти вопросы довольно легко решить с помощью тестовой программы:
class Program
{
static void Main(string[] args)
{
var person = new Person1
{
Id = 12345,
Name = "Fred",
Address = new Address
{
Line1 = "Flat 1",
Line2 = "The Meadows"
}
};
//
byte[] arr = Serialize(person);
Person2 newPerson = Deserialize(arr);
/*
using (var file = File.Create("person.bin"))
{
Serializer.Serialize(file, person);
}
//
Person newPerson;
using (var file = File.OpenRead("person.bin"))
{
newPerson = Serializer.Deserialize<Person>(file);
}
*/
}
public static byte[] Serialize(Person1 person)
{
byte[] result;
using (var stream = new MemoryStream())
{
Serializer.Serialize(stream, person);
result = stream.ToArray();
}
return result;
}
public static Person2 Deserialize(byte[] tData)
{
using (var ms = new MemoryStream(tData))
{
return Serializer.Deserialize<Person2>(ms);
}
}
}
[ProtoContract]
class Person1
{
[ProtoMember(1)]
public int Id { get; set; }
[ProtoMember(2)]
public string Name { get; set; }
[ProtoMember(3)]
public Address Address { get; set; }
}
[ProtoContract]
class Address
{
[ProtoMember(1)]
public string Line1 { get; set; }
[ProtoMember(2)]
public string Line2 { get; set; }
}
[ProtoContract]
class Person2
{
[ProtoMember(1)]
public int Id { get; set; }
[ProtoMember(2)]
public string Name { get; set; }
[ProtoMember(3)]
public Address Address { get; set; }
}
Итак, чтобы проверить, будет ли Protobuf.net игнорировать свойство Name при сериализации, сначала запустите код в режиме отладки, чтобы увидеть общее количество байтов со всеми 3 сериализованными свойствами.Это можно сделать, установив точку останова в строке Serialize (person) и изучив размер arr.
Затем удалите атрибут [ProtoMember (2)] из свойства Name класса Person1.Выполнение кода в отладке показывает, что он пропускает его, потому что число байтов на 6 меньше, чем раньше.Когда объект затем десериализуется обратно в объект Person2, он затем показывает, что свойство Name инициализируется как null.
После замены атрибута [ProtoMember (2)] для свойства Name в классе Person1,удалите этот же атрибут для класса Person2.После отладки кода он показывает, что после вызова Deserialize свойство Person2.Name имеет значение null.
Итак, похоже, что Protobuf.net был хорошо спроектирован, чтобы быть достаточно гибким, эффективным иНекоторые способы обратно совместимы в том смысле, что они поддерживают удаление устаревших свойств.