GridStorage(appeng.me.GridStorage)
基本信息
| 属性 | 值 |
|---|---|
| 源码 | appeng/me/GridStorage.java |
| 类声明行号 | 30 |
| 实现接口 | appeng.api.networking.IGridStorage |
| 三个构造器 | :44(带 id + search)、:57(带 initial value)、:76(无参,存档反序列化用) |
| 挂载点 | appeng.core.worlddata.WorldData,由 Grid.java:150 / Grid.java:168 申请 |
职责
IGridStorage 是网格的持久化载体,与 Grid(运行时对象)严格分离:
Grid |
GridStorage |
|
|---|---|---|
| 生命周期 | 内存中,随网增删 | 跨存档,挂在 WorldData |
| 身份 | UUID(Grid.java:42) |
long myID(GridStorage.java:127) |
| 关联 | 反向持有 WeakReference<Grid> |
getGrid()(:113-115)返回弱引用目标 |
getGrid() 用 WeakReference 解析(:114)——网没了,引用自动变 null,
存储对象不会因此泄漏。
序列化
getValue()(GridStorage.java:83-111)是自定义的落盘入口,做了三件事:
- 先存:
currentGrid.saveState()(:86)→ 触发Grid.saveState()(Grid.java:283-287)→ 每个 cache 的populateGridStorage(this.myStorage)。 - 丢弃空壳:
data.hasNoTags()直接返回null(:89-91)。 - 丢弃零能量:
extraEnergy为0.0D时移除该 tag,若随即无 tag 也返回null(:93-100)——见 AEConfig 与 能量子系统。
压缩编码:CompressedStreamTools.writeCompressed → Base64(:104-105),
用的是 javax.xml.bind.DatatypeConverter.printBase64Binary。
GridStorageSearch:弱引用索引
GridStorageSearch.java:15 是配套的弱引用容器,hashCode(:30)/equals(:35)
都只按 long id 比。getGridStorage() / setGridStorage(WeakReference)
(:47 / :51)存取弱引用。
用途:Grid.add() 在两张网相撞时用 gs.hasDivided(this.myStorage)(Grid.java:155)
判断是否已分裂过 —— 这个查询走的就是 GridStorageSearch 的 id 索引。
分裂 / 合并契约
| 方法 | 调用方 | 语义 |
|---|---|---|
hasDivided(IGridStorage) |
Grid.java:155 |
该存储是否已与目标分裂过(防重复 split) |
addDivided(IGridStorage) |
Grid.java:156 |
记录分裂 |
remove() |
Grid.java:121 |
网空销毁时清理存储 |
注意
- 压缩用的
ByteArrayOutputStream与Base64都不带版本号或校验;getValue()失败时只AELog.debug(e)(:107)并返回null, 也就是静默丢失该网的持久化数据。 dataObject()(:122-124)直接返回内部NBTTagCompound引用,没有防御性拷贝。