概述:Protobuf-net是C#中高效的二進位序列化工具,以緊湊、跨語言支持和卓越性能著稱。通過定義消息類型、序列化和反序列化實現數據傳輸,並可適用於Web介面。前端可使用protobuf.js庫解析Protobuf格式數據。 Protobuf-net 在 C# 中的編碼結構及使用方法 優點 P ...
概述:Protobuf-net是C#中高效的二進位序列化工具,以緊湊、跨語言支持和卓越性能著稱。通過定義消息類型、序列化和反序列化實現數據傳輸,並可適用於Web介面。前端可使用protobuf.js庫解析Protobuf格式數據。
Protobuf-net 在 C# 中的編碼結構及使用方法
優點
Protobuf-net(Protocol Buffers)是一種高效的二進位序列化工具,具有以下優點:
- 高效緊湊: 生成的二進位數據體積小,傳輸效率高。
- 跨語言支持: 適用於多語言環境,實現了多語言間數據的無縫交互。
- 性能優越: 相比其他序列化方式,序列化和反序列化速度更快。
使用方法
1. 定義消息類型
使用 ProtoContract 和 ProtoMember 屬性定義消息類型:
[ProtoContract]
public class Person {
[ProtoMember(1)]
public int Id { get; set; }
[ProtoMember(2)]
public string Name { get; set; }
[ProtoMember(3)]
public string Email { get; set; }
}
2. 序列化與反序列化
// 序列化
Person person = new Person { Id = 1, Name = "John Doe", Email = "[email protected]" };
using (MemoryStream stream = new MemoryStream()) {
Serializer.Serialize(stream, person);
byte[] serializedData = stream.ToArray();
// 將 serializedData 發送給其他系統或保存到文件
}
// 反序列化
byte[] receivedData = /* 從其他系統獲取的數據 */;
using (MemoryStream stream = new MemoryStream(receivedData)) {
Person deserializedPerson = Serializer.Deserialize<Person>(stream);
// 使用 deserializedPerson 對象
}
註意事項
- 版本一致性: 序列化和反序列化的結構版本需一致,以免造成相容性問題。
- 預設值: Protobuf 不會序列化預設值,需註意預設值可能導致的數據丟失。
是否適合 Web 介面使用
Protobuf-net 適用於 Web 介面,尤其是對於需要高性能和低帶寬的場景。通過配置 Web API 或 gRPC 伺服器,可以使用 Protobuf 格式進行數據傳輸。
前端JS調用和解析
前端可以使用protobuf.js庫解析Protobuf格式的數據,以下是簡單的示例:
<script src="https://cdn.jsdelivr.net/npm/protobufjs/dist/protobuf.min.js"></script>
<script>
// 載入Protobuf定義
protobuf.load("path/to/your/protofile.proto", function(err, root) {
if (err) throw err;
// 獲取消息類型
var Person = root.lookupType("YourNamespace.Person");
// 解碼二進位數據
var binaryData = /* 從伺服器獲取的二進位數據 */;
var message = Person.decode(binaryData);
// 使用解碼後的消息對象
console.log(message);
});
</script>
在這個例子中,通過protobuf.js載入Protobuf定義,然後使用lookupType獲取消息類型,最後通過decode方法解碼伺服器返回的二進位數據。得到解碼後的消息對象後,可以在前端JS中方便地使用。