Unity C# 类的序列化 [Serializable] 是怎么定义的?

2 篇文章 0 订阅
1 篇文章 0 订阅
1. 定义自己的Attribute。

在使用Unity开发的时候。时常会用到 [Serializable] 特性来序列化处理一个类。然后想着自己也定义一个 Attribute来管理自己代码。
可以看到[Serializable]代码如下:

using System.Runtime.InteropServices;

namespace System
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Delegate, Inherited = false, AllowMultiple = false)]
    [ComVisible(true)]
    public sealed class SerializableAttribute : Attribute
    {
        public SerializableAttribute();
    }
}

在提到AttributeUsage的时候顺便给一下其他设定好的一些特性。

  1. Conditional:这个预定义特性标记了一个条件方法,其执行依赖于指定的预处理标识符。类似于(脚本案例在下面)
  2. Obsolete : 感觉这个见到的应该是最多的。通常Unity升级之后。在调用老的代码,会提示xxx方法已经过时,请使用xxx
  3. 更多基础信息:https://www.runoob.com/csharp/csharp-attribute.html

Conditional类似于下面这种方法。只不过好像Conditional是编译之后才会有效。

#define Debug

...
using System;
...

# if Debug
public class Test
{
    //....
}
#endif

话题扯回来吧,咱还是弄咱的Attribute吧。

emmm… 我感觉好像也不用说了。上面贴了[Serializable]代码已经告诉了咱使用方式了。我就贴一个自己的案例代码吧。边看边说比较快。

//首先定义一个名文"Version"的属性。后面的“Attribute”是语法要求。必须加
//定义的时候,里面需要设置一些属性。百度一下很多的解释
[AttributeUsage(AttributeTargets.All | AttributeTargets.Struct, Inherited = false)]
public class VersionAttribute : Attribute
{
    public string Author;  //作者名字
    public string Description;   //描述
    public string VersionCode;   //版本号

    public VersionAttribute(string author, string description, string versioncode)
    {
        this.Author = author;
        this.Description = description;
        this.VersionCode = versioncode;
    }

    public VersionAttribute(string description, string versioncode) : this("NoName", description, versioncode) { }

    //这个方法呢。就厉害了。反正作为技术渣渣的我,一直都还没有弄过反射。大概项目中没有用到。
    //调用这个方法,就可以查看所在程序集[assembly]下,所有使用了咱"Version"的类等等,和对应字段设置的属性值。
    public static void GetVersionInfo(string assemblyName)
    {
        Assembly assebly = Assembly.Load(assemblyName);
        Type[] types = assebly.GetTypes();
        foreach (Type t_type in types)
        {
            if (!t_type.IsClass)
                continue;
            var attributes = t_type.GetCustomAttributes(typeof(VersionAttribute), false);
            foreach (var attribute in attributes)
            {
                VersionAttribute vAttribute = (VersionAttribute)attribute;
                UnityEngine.Debug.Log("类名:" + t_type.ToString());
                UnityEngine.Debug.Log("作者:" + vAttribute.Author);
                UnityEngine.Debug.Log("描述:" + vAttribute.Description);
                UnityEngine.Debug.Log("版本:" + vAttribute.VersionCode);
            }
        }
    }

}

//下面两个类就是使用的方法了
[Version("Edwin","C#特性测试","v1.0.0")]
public class UnityAttribute 
{

    [Conditional("DEBUG")]
    public static void Message(string msg)
    {
        UnityEngine.Debug.Log("Attribute : " + msg);
    }
}

[Version("李本心明", "C#特性测试", "v2.0.0")]
public class UnityAttribute2
{

    [Conditional("DEBUG")]
    public static void Message(string msg)
    {
        UnityEngine.Debug.Log("Attribute : " + msg);
    }
}

下来咱就使用以下GetVersionInfo这个方法。看一下都哪些人偷偷的用了咱的 Version特性。

    //打印一下,目前代码所在的 `Assembly`程序集。 发现是 “Assembly-CSharp”
    Debug.Log("Assembly : " + System.Reflection.Assembly.GetExecutingAssembly().GetName());
    //然后调用下面方法。查看谁都在用咱的`Version`特性。
    VersionAttribute.GetVersionInfo("Assembly-CSharp");

打印效果如下

在这里插入图片描述

Very Beautiful !!



这里写图片描述

我是李本心明


首先谢谢大家的支持,其次如果你碰到什么其他问题的话,欢迎来 我自己的一个 讨论群559666429来(扫扫下面二维码或者点击群链接 Unity3D[ 交流] ),大家一起找答案,共同进步

由于工作生活太忙了,对于大家的帮助时间已经没有之前那么充裕了。如果有志同道合的朋友,可以接受无偿的帮助别人,可以加我QQ单独联系我,一块经营一下。


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity3D 中使用 C# 解析 JSON 数据,可以使用 Unity 内置的 JsonUtility 或者第三方的 Json.NET 库。下面分别介绍两种方法的使用。 1. 使用 Unity 内置的 JsonUtility JsonUtility 是 Unity 内置的用于 JSON 序列化和反序列化,使用起来非常简单。以下是一个使用 JsonUtility 解析 JSON 数据的示例: ```csharp [System.Serializable] public class UserData { public int id; public string name; public int age; // 可以定义其他需要的字段 } public void ParseJsonData(string jsonData) { UserData userData = JsonUtility.FromJson<UserData>(jsonData); Debug.Log("id: " + userData.id); Debug.Log("name: " + userData.name); Debug.Log("age: " + userData.age); } ``` 在上面的代码中,我们先定义了一个 UserData ,用于保存从 JSON 数据中解析出来的字段。然后使用 JsonUtility 的 `FromJson` 方法将 JSON 数据转换为 UserData 对象,并输出解析出来的字段。 需要注意的是,JsonUtility 只支持简单的 JSON 数据型,如基本型、数组和嵌套对象。如果需要解析复杂的 JSON 数据,需要使用第三方的 Json.NET 库。 2. 使用 Json.NET 库 Json.NET 是一个流行的 .NET 平台上的 JSON 序列化和反序列化库,支持各种复杂的 JSON 数据型,使用起来非常方便。以下是一个使用 Json.NET 解析 JSON 数据的示例: ```csharp using Newtonsoft.Json; public void ParseJsonData(string jsonData) { JObject jObject = JsonConvert.DeserializeObject<JObject>(jsonData); int id = jObject["id"].ToObject<int>(); string name = jObject["name"].ToObject<string>(); int age = jObject["age"].ToObject<int>(); Debug.Log("id: " + id); Debug.Log("name: " + name); Debug.Log("age: " + age); } ``` 在上面的代码中,我们使用了 Json.NET 的 `DeserializeObject` 方法将 JSON 数据转换为 JObject 对象(JObject 是 Json.NET 中用于表示 JSON 对象的)。然后使用 JObject 的索引器来获取字段的值,并使用 `ToObject` 方法将其转换为对应的型。 需要注意的是,使用 Json.NET 库需要先安装 Newtonsoft.Json 包。可以在 Unity 的 Package Manager 中搜索 "Json.NET" 并安装即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值