【Grasshopper基础8】电池的序列化与反序列化 Serilization of Grasshopper Component

本文详细解释了GH_Component中Read和Write函数在电池数据序列化中的关键作用,如何确保状态持久化,以及它们在Grasshopper文件读写中的实际应用和自定义电池的反序列化过程。

这篇文章的内容是介绍GH_Component中另外一对可以被 override 的函数:

  • Read
  • Write

当我们在自己的电池中直接 override 时,Visual Studio会帮我们添加基类实现:

public override bool Read(GH_IReader reader)
{
   
   
    return base.Read(reader);
}

public override bool Write(GH_IWriter writer)
{
   
   
    return base.Write(writer);
}

这一对函数是用来进行序列化电池数据的。它们的最主要的应用场景是将某些属于电池的状态数据 存储 在电池所在的 .gh 文件中。

举个例子:Grasshopper中有许多电池是具备多个形态的,比如 Cross Reference 电池,它的不同工作模式可以使得两个列表对象以不同的方式匹配到一起:

Record_2021_02_19_23_41_40_208

那么问题就来了,Grasshopper是如何实现打开一个 .gh 文件时让这个电池还保持它上次在文件关闭时的电池形态呢?进一步的,GH在文件保存时是怎么知道这个电池处于什么状态下呢?

这里就需要使用到这一对函数了。在Grasshopper打开文件时,会调用电池的Read函数,读取 .gh 文件中属于该电池的数据内容;Write函数正好相反,是在每次 .gh 文件保存时,将属于电池的数据写入到 .gh 文件的数据内容存储区。

电池的序列化

所有的电池其本质上都是一个自定义类,其继承自GH_Component。但所有程序都是在内存中运行的,因此,我们在GH画布上创作的电池其本质都是 在内存中 创造/销毁数据。当我们的自定义电池被拖入GH画布上时,一个自定义电池类的实例就会在内存中被创建;我们在GH画布上删除一个电池时,一个自定义电池类的实例就会在内存中被销毁。

.gh 文件被保存时,这些内存中的电池实例就会被“序列化”至硬盘上。 .gh 文件被打开的时候,Grasshopper就会“反序列化”将硬盘上的内容读取到内存中。

WeChat Screenshot_20210220000341

但是,我们都知道,硬盘上只能存储0和1。那一堆0和1是怎么变成我们的自定义类的,我们自定义类又是如何变成0和1?这就需要我们定义“序列化规则”。

自定义电池类的基类GH_Component已经由GH的开发者实现了一套默认的序列化规则,放在这一对函数ReadWrite中来帮助我们实现电池的序列化和反序列化,因此电池中的基础数据就可以被正确地存盘和读取,包括并不限于:

  • 电池的名字(Name)
  • 电池的描述(Description)
  • 电池是否打开预览(Preview)
  • 电池是否处于激活状态(Active)
  • ……

因此,即便自定义电池中不重写Read

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值