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