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

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

C#中,if语句可以使用逻辑运算符"||"(或)来判断多个条件。可以将多个条件合并为一个条件,以简化代码,例如: ```csharp if (a == "FCREATORID" || a == "FCRE" || a == "FCREATO1") { // 执行相应的代码 } ``` 这样的写法是合法的,可以达到预期的效果。 然而,如果存在大量的条件需要判断,可以考虑使用集合或数组来存储这些条件,然后使用LINQ查询或循环语句来进行判断,以提高代码的可维护性和可读性。例如: ```csharp string[] validValues = { "FCREATORID", "FCRE", "FCREATO1" }; if (validValues.Contains(a)) { // 执行相应的代码 } ``` 这样的写法可以将所有的有效值存储在validValues数组中,然后使用Contains方法来判断变量a是否包含在数组中。这种写法更加灵活,可以方便地添加或删除条件,同时使代码更加清晰。 相关问题: 1. C#中有哪些逻辑运算符?它们的使用方式是什么? 2. 如何使用LINQ查询来判断一个变量是否在一个集合中? 3. 为什么使用集合或数组来存储条件可以提高代码的可维护性和可读性?<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [FCRE(第四章)](https://blog.csdn.net/rdgh428726/article/details/129104662)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [FCRE2.1 1314、数组5(矩阵对角线元素之和)](https://blog.csdn.net/vecboo/article/details/129205229)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [SinaTair(微博air客户端)免费下载 v1.67.zip](https://download.csdn.net/download/weixin_39840924/11372510)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值