共用方式為


移轉到 MessagePack (二進位)

MessagePack 是一種緊湊的二進位 serialization 格式,相較於 JSON 和 XML,其產生的訊息大小更小。 開放原始碼的 C# 用 MessagePack 庫具有高效能,並提供內建的超快速 LZ4 壓縮,以進一步縮小資料大小。 當資料類型使用 DataContractSerializer 或該資源庫自有的屬性進行註解時,效果最佳。 它可以設定為支援 AOT 環境、非公共類型和成員,以及唯讀類型和成員。

從 BinaryFormatter 移轉期間,適用於 C# 的 MessagePack 的某些行為和功能值得注意,特別是無法對序列化類型 API 所做的變更或需要最小化時。

  • 根據預設,只有公用類型可序列化。 只有在提供 StandardResolverAllowPrivate.Options 做為 MessagePackSerializer.SerializeMessagePackSerializer.Deserialize 方法的引數時,才能序列化私人和內部結構與類別。

  • MessagePack 需要以 [MessagePackObject] 屬性註釋每個可序列化的類型。 您可以使用 ContractlessStandardResolver 來避免這種情況,但未來可能會造成版本設定的問題。

  • 每個可序列化的非靜態欄位和屬性都必須以 [Key] 屬性註釋。 如果您以 [MessagePackObject(keyAsPropertyName: true)] 屬性註釋類型,則成員不需要明確的批註。 在這種情況下,若要忽略特定公用成員,請使用 [IgnoreMember] 屬性。

  • 若要序列化私人成員,請使用 StandardResolverAllowPrivate

  • System.Runtime.Serialization 註釋可以取代 MessagePack 批注:[DataContract] 取代 [MessagePackObject][DataMember] 取代 [Key][IgnoreDataMember] 取代 [IgnoreMember]。 如果您想要避免在定義可序列化類型的連結庫中的 MessagePack 相依性,這些批注就很實用。

  • 這些註釋支援唯讀/不可變的類型和成員。 序列化程式會嘗試使用公用建構函式與最相符的引數清單。 您可以使用 [SerializationConstructor] 屬性,以明確的方式指定建構函式。

  • 任意類型的 Serialization 可透過簡單撰寫的自訂格式器來支援。 這會移除屬性和特定建構函式或成員模式的所有需求。

  • 序列化程序支援 .NET 基底類別程式庫所提供的最常使用的內建類型和集合。 您可以在官方檔案中找到完整清單。此清單有允許自訂的擴充點

警告

MessagePack 具有 API,允許在不限制類型的情況下還原序列化資料。 根據 MessagePack 安全性注意事項,應避免這些 API。

警告

某些 MessagePack API 的行為可透過可變動的靜態進行自訂,這表示您的程式碼可能會根據相同流程中的其他程式碼成功或失敗,AssemblyLoadContext 或 AppDomain 可能會執行此動作。 您也可以參考 MessagePackAnalyzer 套件並啟用 MsgPack001 和 MsgPack002 分析器,藉此讓程式碼保持復原,以呼叫具有可變更行為的 API 使用。