Допустим, мы имеем следующие три класса:Protobuf-net. Десериализации на основе
[ProtoContract]
[ProtoInclude(10, typeof(FirstType))]
[ProtoInclude(20, typeof(SecondType))]
public class Base
{
[ProtoMember(1)]
public int ClassId {get;set;}
}
public class FirstClass : Base
{
...
}
public class SecondClass : Base
{
...
}
И есть отношения между идентификатором класса (в базовом классе) и типом класса соответствия ребенка. Например,
var obj1 = new FirstClass() {ClassId = 1}
var obj2 = new SecondClass() {ClassId = 2}
Теперь предположим, что мы сериализуем эти объекты. Вопрос в том, есть ли хороший способ десериализации сериализованного protobuf на основе значения класса Id, просматривая поле ClassId? то есть, если значение classId в запрограммированном protobuf равно 1, затем используйте FirstClass для десериализации оставшихся байтов потока.
спасибо!
Спасибо за ваши ответы! еще один вопрос: очень интересен способ чтения прото-потока через ProtoReader. Похоже, я могу использовать собственный пользовательский конвертер (например, JsonConverter в Json.Net), который будет использоваться при десериализации. В Protobuf-net есть ли способ передать такой пользовательский конвертер, чтобы при дезадаптации объектов этот пользовательский конвертер можно использовать вместо стандартного? – soleiljy
@soleiljy определяет «пользовательский конвертер» в этом контексте? «ProtoReader» и «ProtoWriter» - это то, что сериализатор использует под капотом - однако они не настраиваются. Существует только один способ чтения базового потока. Если вы имеете в виду «Я могу написать свой собственный движок поверх« ProtoReader »- уверен: получайте удовольствие. Ниже приведен пример пользовательского сериализатора DataTable: https://code.google.com/p/protobuf-net/source/browse/trunk/DataTableSerializer –