DeepSeek教unity------MessagePack-01

中文:GitCode - 全球开发者的开源社区,开源代码托管平台

MessagePack是C# 的极速 MessagePack 序列化器。它比 MsgPack-Cli 快 10 倍,并且性能超过其他 C# 序列化器。MessagePack for C# 还内置支持 LZ4 压缩------一种极其快速的压缩算法。性能在诸如游戏、分布式计算、微服务或数据缓存等应用中尤为重要。

这个库通过 NuGet 分发。也有特殊的 Unity 支持。我们针对 .NET Standard 2.0 进行了优化,特别适用于 .NET 8+ 和 .NET Framework。库代码是纯 C#(在某些平台上使用即时 IL 代码生成或 AOT 安全源生成器)。

要使用 NuGet 安装,只需安装 MessagePack 包。还有多种官方和第三方扩展包可用(了解更多请参阅我们的扩展部分):

MessagePack.ReactiveProperty

MessagePack.UnityShims

MessagePack.AspNetCoreMvcFormatter

最低支持的 Unity 版本将是 2022.3.12f1,因为需要通过 C# 源生成器支持 IL2CPP。在 Unity 中使用它需要两个安装步骤。这两个步骤都需要完成,而不仅仅是一个。

1、从 NuGet 使用 NuGetForUnity 安装 MessagePack。从 NuGet -> 管理 NuGet 包 打开窗口,搜索 "MessagePack" 并点击安装。

复制代码
https://github.com/GlitchEnzo/NuGetForUnity

2、通过引用 Git URL 安装 MessagePack.Unity 包。打开包管理器窗口并点击从 Git URL 添加包,输入以下路径:

复制代码
https://github.com/MessagePack-CSharp/MessagePack-CSharp.git?path=src/MessagePack.UnityClient/Assets/Scripts/MessagePack

MessagePack 使用 ..* 发布标签,因此你可以指定一个版本,如 #v3.0.0。例如:

复制代码
https://github.com/MessagePack-CSharp/MessagePack-CSharp.git?path=src/MessagePack.UnityClient/Assets/Scripts/MessagePack#v3.0.0

在 Unity 中,MessagePackSerializer 可以序列化 Vector2、Vector3、Vector4、Quaternion、Color、Bounds、Rect、AnimationCurve、Keyframe、Matrix4x4、Gradient、Color32、RectOffset、LayerMask、Vector2Int、Vector3Int、RangeInt、RectInt、BoundsInt 以及它们的可空类型、数组和列表类型,这通过内置的扩展 UnityResolver 实现。

MessagePack.Unity 在应用程序启动时自动将 UnityResolver 添加到默认选项解析器中,以便启用此序列化。如果你想自定义解析器或更改默认选项,最好记住这一点。在 Unity 包中有如下的代码来实现这一点:

复制代码
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
private static void Init()
{
    MessagePackSerializer.DefaultOptions = MessagePackSerializerOptions.Standard.WithResolver(UnityResolver.InstanceWithStandardResolver);
}

示例:

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MessagePack;

public class GameRoot : MonoBehaviour
{
    //调用 MessagePackSerializer.Serialize<T>/Deserialize<T> 来序列化/反序列化你的对象实例。
    //你可以使用 ConvertToJson 方法来获取任何 MessagePack 二进制数据的人类可读表示。
    private void Start()
    {
        var mc = new MyClass
        {
            Age = 99,
            FirstName = "hoge",
            LastName = "huga",
        };

        byte[] bytes = MessagePackSerializer.Serialize(mc);
        MyClass mc2 = MessagePackSerializer.Deserialize<MyClass>(bytes);
        Debug.Log($"Age: {mc2.Age}, FirstName: {mc2.FirstName}, LastName: {mc2.LastName}");
        // 你可以将 MessagePack 二进制数据转储为人类可读的 JSON。
        // 使用索引键(而不是字符串键)会序列化为 MessagePack 数组,
        // 因此属性名称不可用。
        // [99,"hoge","huga"]
        var json = MessagePackSerializer.ConvertToJson(bytes);
        Debug.Log(json);
    }
}



//定义要序列化的结构或类,并用[MessagePackObject] 属性对其进行注解。使用[Key] 属性对需要序列化成员(包括字段和属性)进行注解。
[MessagePackObject]
public class MyClass
{
    // Key 属性需要一个序列化索引(或字符串名称)
    // 这些值必须是唯一的,并且还需要考虑版本控制。
    // Keys 在后续部分有更详细的描述。
    [Key(0)]
    public int Age { get; set; }

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

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

    // 所有不应被序列化的字段或属性必须用 [IgnoreMember] 进行注解。
    [IgnoreMember]
    public string FullName { get { return FirstName + LastName; } }
}
cs 复制代码
/****************************************************
    文件:Test_01.cs
	作者:Edision
    日期:#CreateTime#
	功能:示例1
*****************************************************/

using MessagePack;
using UnityEngine;

public class Test_01 : MonoBehaviour
{
    //调用 MessagePackSerializer.Serialize<T>/Deserialize<T> 来序列化/反序列化你的对象实例。
    //你可以使用 ConvertToJson 方法来获取任何 MessagePack 二进制数据的人类可读表示。
    public void Test()
    {
        var mc = new MyClass
        {
            Age = 99,
            FirstName = "hoge",
            LastName = "huga",
        };

        byte[] bytes = MessagePackSerializer.Serialize(mc);
        MyClass mc2 = MessagePackSerializer.Deserialize<MyClass>(bytes);
        Debug.Log($"【Test_01Logo】Age: {mc2.Age}, FirstName: {mc2.FirstName}, LastName: {mc2.LastName}");
        // 你可以将 MessagePack 二进制数据转储为人类可读的 JSON。
        // 使用索引键(而不是字符串键)会序列化为 MessagePack 数组,
        // 因此属性名称不可用。
        // [99,"hoge","huga"]
        var json = MessagePackSerializer.ConvertToJson(bytes);
        Debug.Log($"【Test_01Logo】{json}");
    }

    //定义要序列化的结构或类,并用[MessagePackObject] 属性对其进行注解。使用[Key] 属性对需要序列化成员(包括字段和属性)进行注解。
    [MessagePackObject]
    public class MyClass
    {
        // Key 属性需要一个序列化索引(或字符串名称)
        // 这些值必须是唯一的,并且还需要考虑版本控制。
        // Keys 在后续部分有更详细的描述。
        [Key(0)]
        public int Age { get; set; }

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

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

        // 所有不应被序列化的字段或属性必须用 [IgnoreMember] 进行注解。
        [IgnoreMember]
        public string FullName { get { return FirstName + LastName; } }
    }
}
相关推荐
CandyU22 小时前
Cursor AI Unity
unity
LF男男2 小时前
Bullect.cs(bullet)——子弹基类
unity
mxwin19 小时前
unity shader中 ddx ddy是什么
unity·游戏引擎·shader
郝学胜-神的一滴21 小时前
[简化版 GAMES 101] 计算机图形学 08:三角形光栅化上
c++·unity·游戏引擎·godot·图形渲染·opengl·unreal
nnsix1 天前
Unity ILRuntime 笔记
unity·游戏引擎
nnsix1 天前
Unity API 兼容的 .NET Standard 2.1 和 .NET Framework 区别
unity·游戏引擎·.net
mxwin1 天前
Unity Shader 制作半透明物体 使用多Pass提前写入深度的方式 避免穿模
unity·游戏引擎
nnsix1 天前
Unity HybridCLR 笔记
笔记·unity·游戏引擎
nnsix1 天前
Unity Addressables 笔记
unity·游戏引擎
RReality1 天前
【Unity Shader URP】视差贴图 实战教程
ui·平面·unity·游戏引擎·图形渲染·贴图