數據契約兼容性
你可以使用 [DataContract]
注解代替 [MessagePackObject]
。如果類型用 DataContract
進行注解,可以使用 [DataMember]
注解代替 [Key]
,并使用 [IgnoreDataMember]
代替 [IgnoreMember]
。
然后,[DataMember(Order = int)]
的行為將與 [Key(int)]
相同,[DataMember(Name = string)]
與 [Key(string)]
相同,[DataMember]
與 [Key(nameof(member name))]
相同。
在共享庫中使用 DataContract
可以使你的類/結構獨立于 MessagePack for C# 序列化。然而,這不被分析器或源生成器支持。此外,像 UnionAttribute
、MessagePackFormatter
、SerializationConstructor
等功能無法使用。因此,我們建議在可能的情況下使用特定的 MessagePack for C# 注解。
序列化只讀/不可變對象成員(SerializationConstructor)
MessagePack for C# 支持只讀/不可變對象/成員的序列化。例如,這個結構體可以被序列化和反序列化。
/****************************************************文件:Test_04.cs作者:Edision日期:#CreateTime#功能:示例4:序列化只讀/不可變對象成員
*****************************************************/using MessagePack;
using UnityEngine;public class Test_04 : MonoBehaviour
{public void Test(){var data = new Point(99, 9999);var bin = MessagePackSerializer.Serialize(data);Debug.Log($"【Test_04Logo】{MessagePackSerializer.ConvertToJson(bin)}");// 允許反序列化不可變對象。var point = MessagePackSerializer.Deserialize<Point>(bin);Debug.Log($"【Test_04Logo】{point.X}-{point.Y}");}[MessagePackObject]public struct Point{[Key(0)]public readonly int X;[Key(1)]public readonly int Y;[SerializationConstructor] //注解手動指定要使用的構造函數。public Point(int x){this.X = x;this.Y = -1;}// 如果沒有標記屬性,則使用這個(最匹配的參數)。public Point(int x, int y){this.X = x;this.Y = y;}}
}