移轉到 MessagePack (二進位)
MessagePack 是一種緊湊的二進位 serialization 格式,相較於 JSON 和 XML,其產生的訊息大小更小。 開放原始碼的 C# 用 MessagePack 庫具有高效能,並提供內建的超快速 LZ4 壓縮,以進一步縮小資料大小。 當資料類型使用 DataContractSerializer
或該資源庫自有的屬性進行註解時,效果最佳。 它可以設定為支援 AOT 環境、非公共類型和成員,以及唯讀類型和成員。
從 BinaryFormatter 移轉期間,適用於 C# 的 MessagePack 的某些行為和功能值得注意,特別是無法對序列化類型 API 所做的變更或需要最小化時。
根據預設,只有公用類型可序列化。 只有在提供
StandardResolverAllowPrivate.Options
做為MessagePackSerializer.Serialize
和MessagePackSerializer.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 使用。