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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值