在Angular中使用Protobuf-net .proto模式

时间:2019-05-09 09:30:55

标签: angular asp.net-web-api protobuf-net

我有一个现有的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 :(得分:0)

从理论上讲,应该正常工作-bcl.proto is a perfectly normal .proto schema-但是,bcl.proto中的类型本质上描述了我如何将.NET类型入侵protobuf。在可能的情况下,我建议您尽量避免这种情况-例如,bcl.proto work 中的DateTimeTimeSpan,但是如果您不在,则很难使用.NET,但是protobuf-net 允许您使用后来添加的Google类型:DurationTimestamp。 protobuf-net并非默认使用这些协议的原因是Google对其添加的时间比protobuf-net的支持晚了很多。要使用此选项(在它起作用的类型上,这是有限的):使用:

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

在属性/字段上。 GetProto / GetSchema将自动发出正确的import语句以匹配您所生成的架构。

但是,对于Guiddecimal,我会说选项不太清楚。对于Guid,如果可能的话,我很想使用string-现实是GUID在 binary 表示法中有如此多的歧义,以至于使用简单的{{1 }}是最实用的选择。 string对于非.NET平台非常不友好:如果可能,请考虑使用decimal-或如果需要避免浮点:要么通过手动缩放整数,或再次使用:double