当前位置: 首页 > 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; }
}

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

http://www.dtcms.com/a/15340.html

相关文章:

  • 【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+源码】基于微信小程序的乡村振兴民宿管理系统
  • c# sqlite 批量生成insert语句的函数
  • ubuntu基于docker部署呼叫中心质检【支持情绪,话术对比】
  • 计算机组成原理—— 总线系统(十一)
  • DeepSeek HuggingFace 70B Llama 版本 (DeepSeek-R1-Distill-Llama-70B)
  • 【MediaTek】 T750 openwrt-23.05编 cannot find dependency libexpat for libmesode
  • 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势 , 基于 openEuler 构建 LVS-DR 群集。
  • 【linux】文件与目录命令 - cut
  • 微信小程序地图标记点,安卓手机一次性渲染不出来的问题
  • node.js下载、安装、设置国内镜像源(永久)(Windows11)
  • 【愚公系列】《Python网络爬虫从入门到精通》008-正则表达式基础