这篇文章的内容是介绍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 电池,它的不同工作模式可以使得两个列表对象以不同的方式匹配到一起:

那么问题就来了,Grasshopper是如何实现打开一个 .gh 文件时让这个电池还保持它上次在文件关闭时的电池形态呢?进一步的,GH在文件保存时是怎么知道这个电池处于什么状态下呢?
这里就需要使用到这一对函数了。在Grasshopper打开文件时,会调用电池的Read函数,读取 .gh 文件中属于该电池的数据内容;Write函数正好相反,是在每次 .gh 文件保存时,将属于电池的数据写入到 .gh 文件的数据内容存储区。
电池的序列化
所有的电池其本质上都是一个自定义类,其继承自GH_Component。但所有程序都是在内存中运行的,因此,我们在GH画布上创作的电池其本质都是 在内存中 创造/销毁数据。当我们的自定义电池被拖入GH画布上时,一个自定义电池类的实例就会在内存中被创建;我们在GH画布上删除一个电池时,一个自定义电池类的实例就会在内存中被销毁。
当 .gh 文件被保存时,这些内存中的电池实例就会被“序列化”至硬盘上。 .gh 文件被打开的时候,Grasshopper就会“反序列化”将硬盘上的内容读取到内存中。

但是,我们都知道,硬盘上只能存储0和1。那一堆0和1是怎么变成我们的自定义类的,我们自定义类又是如何变成0和1?这就需要我们定义“序列化规则”。
自定义电池类的基类GH_Component已经由GH的开发者实现了一套默认的序列化规则,放在这一对函数Read和Write中来帮助我们实现电池的序列化和反序列化,因此电池中的基础数据就可以被正确地存盘和读取,包括并不限于:
- 电池的名字(Name)
- 电池的描述(Description)
- 电池是否打开预览(Preview)
- 电池是否处于激活状态(Active)
- ……
因此,即便自定义电池中不重写Read

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

被折叠的 条评论
为什么被折叠?



