Сериализация объекта без интересных полей для записи не является ошибкой как таковой - довольно необычной, но не совсем ошибкой - так и есть: она не жалуется. Нулевые байты - это допустимая длина сериализации для protobuf, даже с полями для сериализации (если все они оказываются пустыми / default-value / conditional-and-disabled / etc). Фактически, это произошло ранее на этой неделе, потому что новый MS WebAPI предполагает (неправильно в данном случае), что длина полезной нагрузки нулевых байтов невозможна, и поэтому не вызывает десериализатор . Вздох.
Но чтобы ответить на ваш вопрос!
Если вы абсолютно уверены, что не собираетесь менять свои DTO, вы можете попросить protobuf-net набрать цифры; это "ImplicitFields", и может быть сделано как:
- все публичные члены (поля или свойства) - это очень похоже на работу XmlSerializer
- все поля (приватные или публичные) - это очень похоже на то, как работает BinaryFormatter
Одна проблема с ImplicitFields заключается в том, что: числа, которые он генерирует, по сути являются контрактом. ImplicitFields генерирует числа, упорядочивая их в алфавитном порядке и просто используя последовательные номера. Если вы измените свой DTO (добавите / удалите / переименуете участника), он может начать думать о других числах, что является серьезным изменением: любые старые данные на диске / в базе данных / и т. Д. Могут не удастся десериализовать правильно.
Если вы уверены, что ваш контракт исправлен, вы можете включить его через (извините, если я ошибаюсь - не на ПК):
[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]
public class Foo { /* blah blah blah */ }
Конечно, вы всегда можете изменить это на явное [ProtoMember(n)]
позже - просто используйте 1, 2, 3 и т. Д. В соответствии с алфавитным расположением элементов, а затем вносите любые изменения, которые вы хотите внести в свой DTO.