Почему я должен использовать [ProtoInclude]? - PullRequest
5 голосов
/ 23 июня 2010

Я прочитал много вопросов о функции наследования в protobuf-net. Мне просто интересно, если я могу использовать [DataContract], [DataMember] таким же образом, как с помощью [ProtoContract], [ProtoMember]. Почему я не смог использовать [KnowType] вместо [ProtoInclude]?

Я поднимаю этот вопрос, потому что уже использовал [DataContract], [DataMember] для сериализации protobuf-net. Не было необходимости добавлять «Protobuf-net». Используется только «System.Runtime.Serialization».

Но ... Теперь, если мой класс должен наследовать от какого-то класса, мне нужно добавить «Protobuf-net» для атрибута [ProtoInclude]? например,

using System.Runtime.Serialization;
namespace test
{

[DataContract]
/// [KnowType(typeof(SomeClass))]
/// or
/// [ProtoInclude(100,typeof(SomeClass))]
public class BaseClass
{
   //...
   [DataMember(Order=1)]
   public string BlahBlahBlah {get; set;}
}

[DataContract]
public class ChildClass1 : BaseClass
{
   //...
   [DataMember(Order=1)]
   public string BlahBlahBlah {get; set;}
}
}// end namespace

наконец, мне интересно, есть ли у меня 100 дочерних классов, разве я не сойду с ума, добавив 100 тегов [ProtoInclude] внутри базового класса?

Спасибо за помощь в любой помощи

ви

1 Ответ

4 голосов
/ 23 июня 2010

РЕДАКТИРОВАТЬ: это больше не требуется в версии 2 - вы можете указать это во время выполнения или использовать DynamicType.


Причина этого заключается в том, что формат протокола protobuf (разработан Google)не включает метаданные какого-либо типа, поэтому нам нужен некоторый способ узнать, о каком типе объекта мы говорим.[KnownType] не предоставляет эту информацию, и не существует четкого способа предоставления надежного ключа независимо.

На самом деле protobuf не поддерживает наследование либо - protobuf-net обходитсяэто путем обработки подтипов как вложенных сообщений.Таким образом, ChildClass1 на самом деле появляется в пути , как если бы BlahBlahBlah было свойством подобъекта, немного похоже на:

message BaseClass {
    optional ChildClass1 ChildClass1 = 1;
    optional SomeOtherSubType SomeOtherSubType = 2;
}
message ChildClass1 {
    optional string BlahBlahBlah = 1;
}

и т.д.опуская это;в "v2" у вас есть возможность указать эти данные за пределами модели типа через ваш собственный код.Это означает, что вам не нужно украшать все, но ему все еще нужен механизм для связывания ключей с типами.

...