当前位置: 首页 > news >正文

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; }
}

请注意,你不能在派生类型中重复使用父类型中已经存在的相同键,因为内部将使用一个单一的扁平数组或映射,因此不能有重复的索引/键。

相关文章:

  • 【C语言】C语言 好声音比赛管理系统(含源码+数据文件)【独一无二】
  • Python的那些事第二十一篇:Python Web开发的“秘密武器”Flask
  • 知识拓展:Python序列化模块 marshal 模块详解
  • 坑多多之ac8257 i2c1 rtc-pcf8563
  • JVM的性能优化
  • 【进阶】MySQL高级篇超详讲解!!!
  • TCP/IP参考模型和网络协议
  • 力扣-二叉树-110 平衡二叉树
  • 如何拿捏 unittest 自动化测试框架?
  • websocketpp库使用:快速搭建一个websocket服务端
  • 在带有Intel Arc GPU的Windows上安装IPEX-LLM
  • 【C++】C++ 旅馆管理系统(含 源码+报告)【独一无二】
  • [鸿蒙笔记-基础篇_生命周期篇] Harmony OS
  • 【Azure 架构师学习笔记】- Azure Databricks (11) -- UC搭建
  • oracle查看执行计划
  • 操作系统知识速记:实现线程同步的方式
  • 2025年3月一区SCI-真菌生长优化算法Fungal growth optimizer-附Matlab免费代码
  • python 浅拷贝和深拷贝
  • Java并发中的CAS机制:原理、应用与挑战(通俗易懂版)
  • 【含文档+PPT+源码】基于微信小程序的乡村振兴民宿管理系统
  • 定制家具生产厂家/盐城seo培训
  • 做网站所具备的的条件/外贸建站教程
  • 网站建设的一般步骤包括/seo技巧
  • 网站后台更改首页代码/优化手机流畅度的软件
  • wordpress 加载完毕/北京seo排名服务
  • 五里坨网站建设/郑州抖音seo