Использование схемы Protobuf-net .proto в Angular - PullRequest
1 голос
/ 09 мая 2019

У меня есть существующий проект Web API, который после запуска некоторых тестов, я хочу начать реализацию protobuf.Используя метод Serializer.GetProto<>(), я получил следующие данные (показывая только начало):

syntax = "proto2";
package MyProject.Models;
import "protobuf-net/bcl.proto"; // schema for protobuf-net's handling of core .NET types

message AssemblyComponentDetailsModel {
   optional .bcl.Guid ID = 1 [default = 00000000-0000-0000-0000-000000000000];
   optional string AssemblyName = 2;
   optional string ReferenceNumber = 3;
   optional .bcl.Guid TypeID = 4 [default = 00000000-0000-0000-0000-000000000000];
   optional .bcl.Guid CategoryID = 5 [default = 00000000-0000-0000-0000-000000000000];
   optional string Symbol = 6;
   repeated ComponentDetailsModel ComponentDetails = 7;
   optional .bcl.Decimal MsrpTotal = 8 [default = 0];
}

Интерфейс проекта использует Angular 7, и я использую информацию на этой странице для его реализации:https://medium.com/francesco-pongetti/using-protocol-buffers-in-a-node-js-angular-web-application-fba17df8ab51.

Мой вопрос таков: у файла прото есть оператор импорта import "protobuf-net/bcl.proto", и используются элементы из этого файла (например, optional .bcl.Guid).Это собирается вызвать проблему десериализации в Angular?Если да, то как проще всего это исправить?В проекте много классов, и я стараюсь не пытаться писать все файлы .proto вручную.

Любые рекомендации / предложения очень ценятся, так как этов первый раз я работаю с protobuf над реальным проектом.

Заранее спасибо.

1 Ответ

0 голосов
/ 09 мая 2019

Теоретически он должен просто работать нормально - bcl.proto - совершенно нормальная схема .proto - однако типы в bcl.proto по сути описывают, как я взламывал типы .NETв протобуф.Там, где это возможно, я бы рекомендовал избегать этого, когда это возможно - например, DateTime и TimeSpan в bcl.proto работают , но работать с ними невероятно неудобно, если вы не в .NET, а protobuf-net также позволяет использовать типы Google, которые были добавлены позже: Duration и Timestamp.Причина, по которой protobuf-net не использует их по умолчанию, заключается в том, что Google добавил их намного позже , чем поддержка protobuf-net.Чтобы использовать эту опцию (на тех типах, где она работает, что ограничено): используйте:

[ProtoMember(n, DataFormat = DataFormat.WellKnown)]

в свойстве / поле.GetProto / GetSchema автоматически выдаст правильные операторы import, соответствующие генерируемой вами схеме.

Однако в случае Guid и decimal я бы сказал, чтоварианты менее понятны.Для Guid я бы соблазнился использовать string, если это возможно - реальность такова, что у направляющих в представлении бинарное столько разночтений, что использование простого string является наиболее прагматичным вариантом,И decimal является очень недружественным для платформ, отличных от .NET: если возможно, рассмотрите возможность использования double - или, если вам нужно избегать с плавающей запятой: либо используйте фиксированную точку с помощью масштабируемого вручную целого числа, либоеще раз: используйте string.

...