常用的应用层传输协议
常用的应用层传输协议
延迟
JSON
文档在这里 json标准东西不多
json的类型支持 字符串(string)、数值(number)、true
、false
、 null
、字典(object)或者数组(array)。这些结构可以嵌套。
在 JSON 传输过程中,列表是有序的,但字典(对象)不是有序的。JSON本身没有明确的长度限制,但是也不会写的巨长,序列化的时候一般会放内存容易崩
XML
该入土的老东西早该爆金币了(
凑活看mozilla的文档吧,下面有其他文档的引用。 XML 树结构 | 菜鸟教程 XML是保证严格有序的
<?xml version="1.0" encoding="UTF-8"?>
<message>
<warning>
Hello World
</warning>
</message>
Protobuf
中文翻译文档和英文原版文档。
这个博客不错,给出了最佳实践和必要的编码原理 google开发的,和json相比体积小速度快,适合IM这种延迟敏感型应用,proto文件是跨语言的,定义好之后可以用(谷歌提供的)工具反向生成各种语言的代码,再结合proto的包去使用,所以说一开始格式就已经被确定了。
📝Note
proto有2和3两个版本是不兼容的,现在绝大部分用的是proto3,如果碰到奇怪的文件请注意proto版本的可能性
注意文档中的协议特性和不适用的地方!!!!!
1 ~ 15:单字节编码,16 ~ 2047:双字节编码,使用频率高的变量最好设置为1~15,编号一旦指定不能修改,所以为了扩展保留一些 1~15 的 编号
Protobuf在消息大小上没有明确限制,但通常建议保持小于2MB(就是不要太大,并不一定非得2MB)。Protobuf的字段顺序在定义时是固定的,但在序列化时不保证顺序
C#代码中可以使用protogen,是针对C#的实现,大致看一眼,用到细节再去查。mac上brew install protobuf
安装,使用protoc --version
查看版本,一般是3.
特性 | protoc | protogen |
---|---|---|
生成的代码 | 标准的 Protocol Buffers C# 类 | 生成的 C# 类更符合 .NET 的风格和最佳实践 |
gRPC 支持 | 支持 gRPC(通过 grpc_csharp_plugin) | 提供更丰富的 gRPC 支持,优化了与 .NET 集成的方式 |
定制化能力 | 基本的 C# 类生成,较少定制化 | 提供更多的扩展点,允许开发者对代码进行自定义 |
.NET 特性 | 提供基础的 C# 支持 | 更好支持 .NET 特性,如依赖注入、日志系统等 |
集成工具 | 与原生 Protobuf 代码生成集成 | 与 .NET 工具链更深度集成,比如 MSBuild 插件 |
使用场景 | 适用于跨平台和多语言项目 | 更适合 .NET 核心或大型 C# 项目,尤其是 gRPC 服务 |
一个基本的protobuf文件的定义如下 |
syntax = "proto3";
package example; // 包可以划分不同的命名空间
// import "user.proto"; // 可以引入其他的包
// 定义一个用户类型的枚举
enum UserType {
UNKNOWN = 0;
ADMIN = 1;
MEMBER = 2;
}
// 地址信息消息
message Address {
string street = 1;
string city = 2;
string state = 3;
string zip_code = 4;
}
// 用户信息消息,嵌套Address
message User {
int32 id = 1;
string name = 2;
string email = 3;
repeated Address addresses = 4; // 嵌套的Address消息类型
UserType type = 5; // 使用枚举类型UserType
}
protobuf中定义了基本的数据类型
proto文件消息类型 | C++ 类型 | 说明 |
---|---|---|
double | double | 双精度浮点型 |
float | float | 单精度浮点型 |
int32 | int32 | 使用可变长编码方式,负数时不够高效,应该使用sint32 |
int64 | int64 | 使用可变长编码方式,负数时不够高效,应该使用sint32 |
uint32 | uint32 | 使用可变长编码方式 |
uint64 | uint64 | 使用可变长编码方式 |
sint32 | int32 | 使用可变长编码方式,有符号的整型值,负数编码时比通常的int32高效 |
sint64 | sint64 | 使用可变长编码方式,有符号的整型值,负数编码时比通常的int64高效 |
fixed32 | uint32 | 总是4个字节,如果数值总是比2^28大的话,这个类型会比uint32高效 |
fixed64 | uint64 | 总是8个字节,如果数值总是比2^56大的话,这个类型会比uint64高效 |
sfixed32 | int32 | 总是4个字节 |
sfixed64 | int64 | 总是8个字节 |
bool | bool | 布尔类型 |
string | string | 一个字符串必须是utf-8编码或者7-bit的ascii编码的文本 |
bytes | string | 可能包含任意顺序的字节数据 |
在 Protocol Buffers (Protobuf) 中,生成的代码会根据目标语言的命名约定来调整字段名。在 C# 中,protoc
会将消息和字段名转换为首字母大写,以符合 C# 的命名约定。
- 消息名:
message hello_world_request
会变为HelloWorldRequest
。
- 字段名:
helloworld
会变为Helloworld
。- 如果字段是用下划线(
_
)分隔的,例如hello_world
,会变成HelloWorld
。
这是 Protobuf 的 protoc
编译器针对 C# 的正常行为,不会影响字段实际存储或序列化的键值,只是对代码接口做了语言风格适配。
Last Edit: 2025-04-13 22:01:52