深度序列化的一种解决方案

说明:在unity3d中自己定义的scriptobject中使用了一个可以序列化的类,希望可以在界面上显示,但这个类的一个树型结构,其中包含了同类型的列表。这种情况下,利用unity自己的序列化方式虽然能够用,但官方强烈不让这样用,还直接报红:Serialization depth limit exceeded at '‘. There may be an object composition cycle in one or more of your serialized classes.,为些想了不少办法,但最终还是需要利用unity自身的序列化方式,不然后不能在界面上显示,也就没有达到可视化的效果。

一、问题来源

1.源码

using System.Collections.Generic;

[System.Serializable]
public class Person {
    public string name;
    public List<Person> childs;
}
[CreateAssetMenu(menuName = "创建FamilyObj")]
public class FamilyObj : ScriptableObject {
    public Person personRoot;

2.问题说明

以上分别是对象模型和一个ScriptObject的脚本,此时,一创建出一个FamilyObj,编辑器就会报红。主要是因为这种序列化的方案不运行空的列表,一但开始序列化,理论会无限创建对象。而unity对这种方案支持的效果不会超过7级,如下图所示:




二、解决方案

1.方案来源

由于这个问题网上十分普遍,但是并没有找到能够满足需求的方案,大多是告诉你怎么不让报错。但并没有说怎么还能显示在界面上的同时不报错,

这是官方说明怎么序列化非常规的类型如字典:https://docs.unity3d.com/ScriptReference/ISerializationCallbackReceiver.html

这是官方说明怎么自己定义序列化:https://docs.unity3d.com/Manual/script-Serialization.html

以上的两个貌似对我也没有什么启发,也没有实现要在界面上显示多层级的树型结构。

2.利用继承和自定义层级的方案

这里说一个我程序内的解决方案:

using System.Collections.Generic;

public abstract class Person {
    public string name;
    public abstract List<Person> childs { get; set; }

    [System.Serializable]
    public class P1 : Person
    {
        public List<P2> _childs;

        public override List<Person> childs
        {
            get
            {
                return _childs.ConvertAll<Person>(x=>x);
            }

            set
            {
                _childs = value.ConvertAll(x => x as P2);
            }
        }
    }

    [System.Serializable]
    public class P2 : Person
    {
        public List<P3> _childs;
        public override List<Person> childs
        {
            get
            {
                return _childs.ConvertAll<Person>(x => x);
            }

            set
            {
                _childs = value.ConvertAll(x => x as P3);
            }
        }
    }
    [System.Serializable]
    public class P3 : Person
    {
        public override List<Person> childs
        {
            get
            {
                Debug.Log("不孕不育");
                return null;
            }

            set
            {
                Debug.Log("不孕不育");
            }
        }
    }
}
[CreateAssetMenu(menuName = "创建FamilyObj")]
public class FamilyObj : ScriptableObject {
    public Person.P1 personRoot;
}

以上为修改后的类,因为并没有引用自己同类型的对象,而且最后一级也已经指定了空,所以程序也并不会报错。由于其他子类都继承于一个抽象类,其他业务逻辑并不会发生改变,主要是创建的时候,需要指定是具体的那个类。此时最好写个对象创建的功能,但并不在本文的讨论范围内。

三、相关文章

虽然,目前已经不会报错了,但由于程序的扩展性问题,这种方案其实还是个问题。一般情况下子层级是有限的,好办到是好办,多加一级就要写不少重复的代码。希望可以遇到更好的解决方案。

下面是一些相关的网站:

Custom serialization:docs.unity3d.com/Manual/script-Serialization-Custom.html

Script serialization errors:https://docs.unity3d.com/Manual/script-Serialization-Errors.html



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 基于深度学习的手势识别算法是一种利用深度神经网络模型来对手势信号进行分类和识别的方法。这种算法利用了深度学习的优势,可以从大量的数据中学习出高效的特征表示,具有较高的识别准确度和实时性。 首先,基于深度学习的手势识别算法需要收集手势信号的数据集。这些数据集可以包含不同手势的图像、视频或传感器数据。然后,可以使用深度学习的方法对这些数据进行训练。 常见的深度学习模型包括卷积神经网络(CNN)和循环神经网络(RNN)。对于图像数据集,可以使用CNN模型提取出图像的有效特征。对于时间序列数据集,可以使用RNN模型捕捉手势信号间的动态变。 在训练过程中,深度学习算法通过多次迭代优模型参数,使得模型能够从输入的手势信号中学到合适的特征表示和分类决策。随着训练的进行,模型可以逐渐提高对手势信号的准确识别能力。 在实际应用中,基于深度学习的手势识别算法可以应用于许多领域,如智能家居、虚拟现实、健康监测等。通过识别用户的手势,可以实现更自然、直观的人机交互方式。 总的来说,基于深度学习的手势识别算法利用深度神经网络模型,能够从大量的手势信号数据中学习到高效的特征表示,并实现准确的手势分类和识别。这种算法在实际应用中具有广泛的潜力和应用场景。 ### 回答2: 基于深度学习的手势识别算法是一种利用深度学习技术对人手的动作进行自动识别和分类的算法。它通过对大量手势数据进行训练,使计算机能够自动学习和理解不同手势表达的含义。 首先,手势识别算法需要获取手势数据。这可以通过摄像头或者传感器捕捉到的图像序列来实现。然后,利用深度学习的卷积神经网络(CNN)模型对手势图像进行特征提取和分类。通常情况下,手势图像需要经过预处理,包括尺寸调整、灰度、去噪等操作,以提高算法的准确性和鲁棒性。 接着,经过数据预处理后的手势图像被输入到CNN模型中进行特征提取和分类。CNN模型通常由多个卷积层、池层和全连接层组成,可以自动学习手势的空间和时间特征。在训练阶段,CNN模型通过反向传播算法不断调整各层的权重和偏置,以最小损失函数。训练完成后,手势识别算法就可以利用CNN模型对新的手势图像进行分类。 最后,基于深度学习的手势识别算法可以应用于各种领域。例如,在交互式设备中,手势识别可以用于识别用户的手势动作,从而实现手势控制。在医疗领域,手势识别可以帮助医生进行手术操作或者康复训练。在安防领域,手势识别可以用于识别可疑人员的手势行为,从而实现智能监控。 总之,基于深度学习的手势识别算法通过自动学习和理解手势的含义,可以广泛应用于各个领域,为人们提供更加智能、便捷和高效的交互方式。 ### 回答3: 基于深度学习的手势识别算法是基于计算机视觉和机器学习的技术,用于识别和理解人体手势的一种方法。这种算法可以通过摄像头或深度传感器捕捉到的图像或数据来判断手势的类型和意义。 深度学习是一种机器学习方法,通过多层神经网络来模拟人脑的神经元和处理方式。在手势识别中,深度学习算法可以通过训练大规模的手势数据集,从而逐渐学习到手势的特征和模式。 基于深度学习的手势识别算法通常包括以下几个步骤: 1. 数据收集和准备:收集并标记手势数据,包括手势的图像或传感器数据。 2. 数据预处理:对手势数据进行归一、降噪和增强等处理,以便提高算法的鲁棒性和准确率。 3. 网络设计:设计一个合适的深度神经网络结构,用于学习和识别手势特征。 4. 数据训练:使用标记好的手势数据集对网络进行训练,优网络参数和权重。 5. 测试和评估:使用未见过的手势数据对训练好的网络进行测试和评估,以评估算法的准确性和鲁棒性。 6. 模型部署:将训练好的手势识别模型嵌入到实际应用中,可以是一个手机应用或其他交互设备。 基于深度学习的手势识别算法在众多应用场景中有着广泛的应用。例如,在虚拟现实和增强现实中,可以通过手势识别算法实现用户的手势交互和操作;在智能家居中,可以通过手势控制设备的开关和调节;在医疗领域中,可以应用于康复训练和运动辅助等方面。 总的来说,基于深度学习的手势识别算法通过训练神经网络和大量的手势数据,实现了对人体手势的自动识别和理解,为实现人机交互和智能设备控制提供了一种有效的解决方案

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值