2013-02-14 3 views
2

Допустим, мы имеем следующие три класса: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 для десериализации оставшихся байтов потока.

спасибо!

ответ

0

Если вы используете ProtoInclude, то protobuf-net уже заботится о том, какой подкласс использовать: вот и весь пункт ProtoInclude. В некоторых случаях использовать наследование невозможно, и в этом случае есть способы прочитать прото-поток через ProtoReader или с помощью второй модели, которая только считывает это свойство, а затем снова перезагружает источник и считывает. Вот пример этого: https://stackoverflow.com/a/14572685/23354

+0

Спасибо за ваши ответы! еще один вопрос: очень интересен способ чтения прото-потока через ProtoReader. Похоже, я могу использовать собственный пользовательский конвертер (например, JsonConverter в Json.Net), который будет использоваться при десериализации. В Protobuf-net есть ли способ передать такой пользовательский конвертер, чтобы при дезадаптации объектов этот пользовательский конвертер можно использовать вместо стандартного? – soleiljy

+0

@soleiljy определяет «пользовательский конвертер» в этом контексте? «ProtoReader» и «ProtoWriter» - это то, что сериализатор использует под капотом - однако они не настраиваются. Существует только один способ чтения базового потока. Если вы имеете в виду «Я могу написать свой собственный движок поверх« ProtoReader »- уверен: получайте удовольствие. Ниже приведен пример пользовательского сериализатора DataTable: https://code.google.com/p/protobuf-net/source/browse/trunk/DataTableSerializer –