Глядя на новые комментарии, представляется, что (как отмечает ОП) MemoryStream
емкость ограничена.Небольшое раздражение в спецификации protobuf состоит в том, что, поскольку длины под-сообщений являются переменными и должны префикс под-сообщения, часто необходимо буферизовать части, пока длина не станет известной.Это хорошо для большинства разумных графов, но если есть исключительно большой граф (за исключением сценария «у корневого объекта есть миллионы прямых дочерних элементов», который не страдает), он может в конечном итоге сделать немного памяти.
Если вы не привязаны к определенному макету (возможно, из-за взаимодействия .proto с существующим клиентом), тогда простое исправление заключается в следующем: для дочерних (подобъектов) свойств(включая списки / массивы подобъектов), скажите ему использовать сериализацию "группы".Это не макет по умолчанию, но он говорит: "вместо использования префикса длины используйте пару токенов начала / конца".Недостатком этого является то, что , если ваш код десериализации не знает о конкретном объекте, требуется больше времени, чтобы пропустить поле, поскольку он не может просто сказать «искать вперед» 231413байты "- вместо этого он должен пройти токены, чтобы узнать, когда объект закончен.В большинстве случаев вообще не является проблемой , поскольку ваш код десериализации полностью ожидает эти данные.
Для этого:
[ProtoMember(1, DataFormat = DataFormat.Group)]
public SomeType SomeChild { get; set; }
....
[ProtoMember(4, DataFormat = DataFormat.Group)]
public List<SomeOtherType> SomeChildren { get { return someChildren; } }
Десериализация в protobuf-net очень простителен (по умолчанию есть необязательный строгий режим), и он с радостью десериализует группы вместо префикса длины и префикса длины вместо групп (то есть: любые данные, которые вы где-то уже сохранили, должны работать нормально).