Protobuf порядок сериализации нескольких объектов? - PullRequest
0 голосов
/ 10 июня 2018

Я создаю сокет-серверное приложение-клиент и использую protobuf-net для сериализации / десериализации данных, передаваемых от одного к другому.Прямо сейчас я отправляю один объект и на рецептор, основываясь на заголовке пакета, я знаю, что я предполагаю получить и десериализовать.Мне было интересно, если будет возможно отправить несколько объектов как объект [] с различными типами на нем, сериализовать и десериализовать независимо от порядка объектов в массиве?Я предполагаю, что это означает, что каждый объект в массиве должен иметь идентификатор типа, так или иначе сериализованный, поэтому при десериализации я знаю, какой это объект.Кроме того, идентификатор переменной (например, имя переменной) позволяет различать несколько объектов одного типа.

Я предполагаю, что самый простой способ - это всегда оборачивать мои данные в один объект со всеми моими данными, каксвойства.Просто интересно, возможно ли это каким-то образом, так как это облегчит мой код, не создавая все эти классы-обертки.

1 Ответ

0 голосов
/ 10 июня 2018

object довольно неловко, потому что у двигателя нет возможности узнать, что вы собираетесь. - это некоторые вещи динамического типа, встроенные в protobuf-net, в которые встроен тип AQN, но, честно говоря, это огромный взлом.Безусловно, ваш лучший выбор - ограничить себя некоторой ограниченной моделью наследования.Например:

[ProtoContract]
[ProtoInclude(1, typeof(Foo)]
[ProtoInclude(2, typeof(Bar)]
public class MessageBase {}

с

[ProtoContract]
public class Foo : MessageBase {}

(и аналогично Bar)

Затем отправьте MessageBase[] и используйте Deserialize (или DeserializeWithLengthPrefix) указав <MessageBase>.Каждое сообщение будет отправлено и получено как правильный тип, разрешающий либо полиморфизм, либо новое switch сопоставление с образцом, которое будет использоваться для маршрутизации входящих сообщений, и нет никакой двусмысленности.

За кадром этореализовано как (в терминах .proto):

message MessageBase {
    oneof ActualType {
        Foo foo = 1;
        Bar bar = 2;
    }
}
message Foo {}
message Bar {}
...