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)是自定义的落盘入口,做了三件事:

  1. 先存:currentGrid.saveState()(:86)→ 触发 Grid.saveState()(Grid.java:283-287)→ 每个 cache 的 populateGridStorage(this.myStorage)。
  2. 丢弃空壳:data.hasNoTags() 直接返回 null(:89-91)。
  3. 丢弃零能量: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 引用,没有防御性拷贝。

相关条目