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

DeepSeek教unity------MessagePack-05

动态反序列化

当调用 `MessagePackSerializer.Deserialize<object>` 或 `MessagePackSerializer.Deserialize<dynamic>` 时,二进制数据中存在的任何值都将被转换为基本值,即 bool、char、sbyte、byte、short、int、long、ushort、uint、ulong、float、double、DateTime、string、byte[]、object[]、IDictionary<object, object>。

/****************************************************
    文件:Test_06.cs
	作者:Edision
    日期:#CreateTime#
	功能:示例6:动态反序列化
*****************************************************/

using MessagePack;
using MessagePack.Resolvers;
using UnityEngine;

public class Test_06 : MonoBehaviour
{
    public void Test()
    {
        // 示例数据.
        var model = new DynamicModel { Name = "foobar", Items = new[] { 1, 10, 100, 1000 } };
        var blob = MessagePackSerializer.Serialize(model, ContractlessStandardResolver.Options);

        使用dynamic类型进行反序列化时,Unity环境未能正确处理C#的动态特性。
        //var deserializedModel = MessagePackSerializer.Deserialize<dynamic>(blob, ContractlessStandardResolver.Options);
        //Debug.Log(deserializedModel["Name"]); // foobar
        //Debug.Log(deserializedModel["Items"][2]); // 100

        // 使用具体类型进行反序列化.
        var deserializedModel = MessagePackSerializer.Deserialize<DynamicModel>(blob, MessagePack.Resolvers.ContractlessStandardResolver.Options);
        Debug.Log(deserializedModel.Name); // 输出: foobar
        Debug.Log(deserializedModel.Items[2]); // 输出: 100
    }


    [MessagePackObject]
    public class DynamicModel
    {
        [Key(0)]
        public string Name { get; set; }

        [Key(1)]
        public int[] Items { get; set; }

        public DynamicModel()
        {
            // 默认构造函数
        }

        public DynamicModel(string name, int[] items)
        {
            Name = name;
            Items = items;
        }

        public override string ToString()
        {
            return $"Name: {Name}, Items: [{string.Join(", ", Items)}]";
        }
    }
}

Object 类型 序列化

StandardResolver 和 ContractlessStandardResolver 可以序列化对象/匿名类型对象。

/****************************************************
    文件:Test_06.cs
	作者:Edision
    日期:#CreateTime#
	功能:示例6:动态反序列化
*****************************************************/

using MessagePack;
using MessagePack.Resolvers;
using UnityEngine;

public class Test_06 : MonoBehaviour
{
    public void Test()
    {
        // 示例数据.
        var model = new DynamicModel { Name = "foobar", Items = new[] { 1, 10, 100, 1000 } };
        var blob = MessagePackSerializer.Serialize(model, ContractlessStandardResolver.Options);

        使用dynamic类型进行反序列化时,Unity环境未能正确处理C#的动态特性。
        //var deserializedModel = MessagePackSerializer.Deserialize<dynamic>(blob, ContractlessStandardResolver.Options);
        //Debug.Log(deserializedModel["Name"]); // foobar
        //Debug.Log(deserializedModel["Items"][2]); // 100

        // 使用具体类型进行反序列化.
        var deserializedModel = MessagePackSerializer.Deserialize<DynamicModel>(blob, ContractlessStandardResolver.Options);
        Debug.Log(deserializedModel.Name); // 输出: foobar
        Debug.Log(deserializedModel.Items[2]); // 输出: 100


        var objects = new object[] { 1, "aaa", new ObjectFieldType { Anything = 9999 } };
        var bin = MessagePackSerializer.Serialize(objects);

        // [1,"aaa",[9999]]
        Debug.Log(MessagePackSerializer.ConvertToJson(bin));

        // Support anonymous Type Serialize
        var anonType = new { Foo = 100, Bar = "foobar" };
        var bin2 = MessagePackSerializer.Serialize(anonType, ContractlessStandardResolverAllowPrivate.Options);

        // {"Foo":100,"Bar":"foobar"}
        Debug.Log(MessagePackSerializer.ConvertToJson(bin2));
    }


    [MessagePackObject]
    public class DynamicModel
    {
        [Key(0)]
        public string Name { get; set; }

        [Key(1)]
        public int[] Items { get; set; }

        public DynamicModel()
        {
            // 默认构造函数
        }

        public DynamicModel(string name, int[] items)
        {
            Name = name;
            Items = items;
        }

        public override string ToString()
        {
            return $"Name: {Name}, Items: [{string.Join(", ", Items)}]";
        }
    }

    [MessagePackObject]
    public class ObjectFieldType
    {
        [Key(0)]
        public int Anything { get; set; }

        public ObjectFieldType()
        {
            // 默认构造函数
        }

        public ObjectFieldType(int anything)
        {
            Anything = anything;
        }

        public override string ToString()
        {
            return $"Anything: {Anything}";
        }
    }
}

在反序列化时,与动态(未类型化)反序列化相同。

相关文章:

  • Nginx实战_高性能Web服务器与反向代理的配置全解
  • 张弛语言课退费动漫配音与人物的深度剖析退费
  • 天童美语:观察你的生活
  • ROS学习
  • 2. 图片性能优化
  • Postman入门:环境变量和全局变量
  • Labview课程2:通过S7.net读取西门子PLC中变量并绘图
  • 【鸿蒙开发】第三十六章 状态管理 - (V2)
  • 单细胞学习(12)——RunUMAP() 详解学习笔记
  • 基于Qlearning强化学习的1DoF机械臂运动控制系统matlab仿真
  • 科普:“数据”与“元数据”
  • 双指针思想
  • ELK架构基础
  • 往年5级考题(c++)
  • 【spring cloud 3.0微服务部署】第一章:Nacos、LoadBalancer、GateWay、Ribbon集成之Nacos部署
  • stable diffusion 文生图流程
  • Vim操作笔记
  • 【BUG】conda虚拟环境下,pip install安装直接到全局python目录中
  • Java 语言深度剖析与实践应用
  • 字节Trae使用感想(后端)
  • 中拉互联网发展与合作论坛在西安开幕
  • 辽宁盘山县一乡镇幼儿园四名老师被指多次殴打一女童,均被行拘
  • 特朗普中东行:“能源换科技”背后的权力博弈|907编辑部
  • 青海省交通运输厅副厅长田明有接受审查调查
  • 玉渊谭天丨卢拉谈美国降低对华关税:中国的行动捍卫了主权
  • 视频|王弘治:王太后,“先天宫斗圣体”?