DeepSeek教unity------MessagePack-04
Union 联合
MessagePack for C# 支持序列化接口类型和抽象类类型的对象。它的行为类似于 XmlInclude 或 ProtoInclude。在 MessagePack for C# 中,这些被称为Union。只有接口和抽象类可以被 Union 属性注解。需要唯一的联合键。
/****************************************************
文件:Test_05.cs
作者:Edision
日期:#CreateTime#
功能:示例5:Union
*****************************************************/
using MessagePack;
using UnityEngine;
public class Test_05 : MonoBehaviour
{
public void Test()
{
//IUnionSample data = new FooClass() { XYZ = 999 };
IUnionSample data = new BarClass() { OPQ = "BarClass" };
// 序列化接口类型的对象。
var bin = MessagePackSerializer.Serialize(data);
// 再次反序列化。
var reData = MessagePackSerializer.Deserialize<IUnionSample>(bin);
// Use with e.g. type-switching in C# 7.0
switch (reData)
{
case FooClass x:
Debug.Log(x.XYZ);
break;
case BarClass x:
Debug.Log(x.OPQ);
break;
default:
break;
}
}
// 注解继承类型
[Union(0, typeof(FooClass))]
[Union(1, typeof(BarClass))]
public interface IUnionSample { }
[MessagePackObject]
public class FooClass : IUnionSample
{
[Key(0)]
public int XYZ { get; set; }
}
[MessagePackObject]
public class BarClass : IUnionSample
{
[Key(0)]
public string OPQ { get; set; }
}
}
联合在内部被序列化为两个元素的数组。
IUnionSample data = new BarClass { OPQ = "FooBar" };
var bin = MessagePackSerializer.Serialize(data);
// Union is serialized to two-length array, [key, object]
// [1,["FooBar"]]
Console.WriteLine(MessagePackSerializer.ConvertToJson(bin));
抽象类与接口运行方式一样
[Union(0, typeof(SubUnionType1))]
[Union(1, typeof(SubUnionType2))]
[MessagePackObject]
public abstract class ParentUnionType
{
[Key(0)]
public int MyProperty { get; set; }
}
[MessagePackObject]
public class SubUnionType1 : ParentUnionType
{
[Key(1)]
public int MyProperty1 { get; set; }
}
[MessagePackObject]
public class SubUnionType2 : ParentUnionType
{
[Key(1)]
public int MyProperty2 { get; set; }
}
请注意,你不能在派生类型中重复使用父类型中已经存在的相同键,因为内部将使用一个单一的扁平数组或映射,因此不能有重复的索引/键。