Protobuf-net:C#高效序列化工具,助力介面傳輸與前端解析

架构师老卢發表於2024-03-07
Protobuf-net:C#高效序列化工具,助力介面傳輸與前端解析

概述:Protobuf-net是C#中高效的二進位制序列化工具,以緊湊、跨語言支援和卓越效能著稱。透過定義訊息型別、序列化和反序列化實現資料傳輸,並可適用於Web介面。前端可使用protobuf.js庫解析Protobuf格式資料。

Protobuf-net 在 C# 中的編碼結構及使用方法

優點

Protobuf-net(Protocol Buffers)是一種高效的二進位制序列化工具,具有以下優點:

  1. 高效緊湊: 生成的二進位制資料體積小,傳輸效率高。
  2. 跨語言支援: 適用於多語言環境,實現了多語言間資料的無縫互動。
  3. 效能優越: 相比其他序列化方式,序列化和反序列化速度更快。

使用方法

1. 定義訊息型別

使用 ProtoContractProtoMember 屬性定義訊息型別:

[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 = "john@example.com" };
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 物件
}

注意事項

  1. 版本一致性: 序列化和反序列化的結構版本需一致,以免造成相容性問題。
  2. 預設值: 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中方便地使用。

相關文章