Unity MessagePack代替Json让你的数据更小还更快

6 篇文章 0 订阅

前言

前端给后端发的Json数据有点大,使用MessagePack优化一下(MessagePack原理官网解释的很清晰),这里直接上用法。
MessagePack简介图

项目

准备一个空项目

下载并安装MessagePack

到下面的地址下载.unitypackage文件拖入Unity中

https://github.com/MessagePack-CSharp/MessagePack-CSharp/releases

下载并安装

拖入之后入下图
拖入Unity

编写测试代码

创建MyClass.cs并写入

using MessagePack;

[MessagePackObject]
public class MyClass
{
    // Key attributes take a serialization index (or string name)
    // The values must be unique and versioning has to be considered as well.
    // Keys are described in later sections in more detail.
    [Key(0)]
    public int Age { get; set; }

    [Key(1)]
    public string FirstName { get; set; }

    [Key(2)]
    public string LastName { get; set; }

    // All fields or properties that should not be serialized must be annotated with [IgnoreMember].
    [IgnoreMember]
    public string FullName { get { return FirstName + LastName; } }
}

创建Program .cs并写入

using System.Collections;
using System.Collections.Generic;
using MessagePack;
using UnityEngine;

public class Program : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        var mc = new MyClass
        {
            Age = 99,
            FirstName = "fn",
            LastName = "ln",
        };

        // Call Serialize/Deserialize, that's all.
        byte[] bytes = MessagePackSerializer.Serialize(mc);
        MyClass mc2 = MessagePackSerializer.Deserialize<MyClass>(bytes);

        // You can dump MessagePack binary blobs to human readable json.
        // Using indexed keys (as opposed to string keys) will serialize to MessagePack arrays,
        // hence property names are not available.
        // [99,"hoge","huga"]
        var json = MessagePackSerializer.ConvertToJson(bytes);
        Debug.Log(json);

    }
}

添加并设置脚本

Program挂载在场景中
将Program挂载在场景中

生成AOT代码

打开CodeGenerator窗口
打开CodeGenerator窗口
写入项目路径和生成的代码路径,并点击Generate按钮生成代码
写入路径

生成的代码如下图
生成之后的代码图

编写加载AOT代码文件

创建Startup.cs并写入

如果使用HybridCLR热更方案,这里的方法建议拿到热更代码刚开始的地方,这里同样可以热更

using MessagePack;
using MessagePack.Resolvers;
using UnityEngine;

public class Startup
{
    static bool serializerRegistered = false;

    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    static void Initialize()
    {
        if (!serializerRegistered)
        {
            StaticCompositeResolver.Instance.Register(
                 MessagePack.Resolvers.GeneratedResolver.Instance,
                 MessagePack.Resolvers.StandardResolver.Instance
            );

            var option = MessagePackSerializerOptions.Standard.WithResolver(StaticCompositeResolver.Instance);

            MessagePackSerializer.DefaultOptions = option;
            serializerRegistered = true;
        }
    }

#if UNITY_EDITOR
    [UnityEditor.InitializeOnLoadMethod]
    static void EditorInitialize()
    {
        Initialize();
    }
#endif
}

运行效果

可以看到能够正确序列化和反序列化类了。
正确解析图

参考

https://github.com/MessagePack-CSharp/MessagePack-CSharp#aot

Unity中,使用Newtonsoft.Json来解析JSON数据是一种常见的做法。你可以将Newtonsoft.Json.dll文件包含在你的项目中,然后使用它来对JSON数据进行解析。这个程序包不需要与jillejr.newtonsoft.json-for-unity软件包一起使用,因为它提供了自己的Newtonsoft.Json实现。你可以在Unity的生态系统中找到许多关于Newtonsoft.Json的分支和变体,但是你可以选择使用该程序包提供的版本。如果你需要使用Newtonsoft.Json的使用教程,你可以参考CSDN上的一个文章,链接如下:。这个教程将向你展示如何在Unity中使用Newtonsoft.Json来解析JSON数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Newtonsoft.Json-for-Unity.Converters:Newtonsoft.Json的常见Unity类型的转换器。 与jilleJrNewtonsoft....](https://download.csdn.net/download/weixin_42112894/18775229)[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* [Unity版Newtonsoft.Json](https://download.csdn.net/download/weixin_38239050/14803540)[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* [UnityIK人体骨骼反向动力学系统插件 Final IK 2.2](https://download.csdn.net/download/mayzhengxi/88262273)[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、付费专栏及课程。

余额充值