типы классов для сериализации десериализации - PullRequest
0 голосов
/ 25 сентября 2018

Можно ли десериализовать из protobuf-net, не зная априори тип объекта?(это необходимо, поскольку я хочу использовать protobuf-net с программным обеспечением ScaleOut, которое в конечном итоге будет хранить объекты разных типов, поэтому при предоставлении обратного вызова метода сериализатора тип объекта неизвестен).

1 Ответ

0 голосов
/ 25 сентября 2018

Это зависит от нескольких факторов.Во-первых, нам нужно прояснить три различных сценария: тип

  • , известный статически как Foo - можно просто использовать универсальный тип API
  • , который не известен статически, но Type будет известен каким-либо образом во время выполнения - может использовать неуниверсальный тип API
  • , который вообще не известен

Я предполагаю, что вы имеете в виду третий вариант.Это наиболее проблематично, потому что protobuf не включает метаданные типа - и действительно те же данные могут быть десериализованы как любой совместимый тип: он не должен быть того же типа.

Если это последний случай, и данные уже сериализованы, то хороших вариантов не так много, кроме, может быть, чисто «расширяемого» типа (базовый тип Extensible обеспечивает доступ во время выполнения к неизвестным полям и поддержку двусторонней поддержки),Тем не менее, он не может материализоваться в конкретный тип объекта, потому что он не знает, какой тип использовать.

Protobuf-net добавляет функцию «динамических типов», которая несколько упрощает это, но это толькоработа для новых данных - это требует определенной конфигурации.Честно говоря, я склонен советовать против этого - это сложно, а не "стандартный протобуф".

...