堕落男
最近刚开始学习插件开发,在尝试建一个简单的领地插件。在领地中有领地数据的功能。然而现实骨感,满屏的红字。

Map序列化接口无效
储存领地数据的是一个实现了bukkit序列化接口的类,继承于map,实现的序列化接口方法如下
  1. public Map<String, Object> serialize() {
  2.     put("==", getClass().getName());
  3.     return this;
  4.     }
复制代码
这是一个很正常的序列化操作。然而实际序列化出来的结果却是这样子的
  1. '2':
  2.   ==: cn.japlayguan.mcplugin.area.v0_2.Area
  3. <b style="background-color: yellow;">  data:
  4.     test: test</b>
  5.   point1:
  6.     ==: org.bukkit.Location
  7.     world: world
  8.     x: -71.0
  9.     y: 62.0
  10.     z: -37.0
  11.     pitch: 0.0
  12.     yaw: 0.0
  13.   point2:
  14.     ==: org.bukkit.Location
复制代码
是的,序列化时的put并没有生效。



尝试寻找官方类(如Location)的序列化方法
在序列化添加绑定class无效的时候,我首先就想到了官方序列化流程是不是有什么规则
说明:这里我并没有找到官方类的一些序列划流程,只是我在看Location实现序列化接口的时候并没有添加“==”这个键,而实际出来的确是自动加上了,因此想问问大佬们关于序列化时类的绑定是否有其他方法?  比如,此处的location到底是再哪、以怎么样的方式绑定的。
注:下方代码是Location类实现的序列化接口

  1. public Map<String, Object> serialize() {
  2.   Map<String, Object> data = new HashMap<String, Object>();
  3.   data.put("world", this.world.getName());

  4.   data.put("x", this.x);
  5.   data.put("y", this.y);
  6.   data.put("z", this.z);

  7.   data.put("yaw", this.yaw);
  8.   data.put("pitch", this.pitch);

  9.   return data;
  10.     }
复制代码




关于Map序列化接口put无效的最终结果
因为我菜,找官方序列化的流程走一半之后我就理不过来了,于是只能动手在原来的领地数据类中的序列化方法多做几次尝试。
当我尝试直接 return null时,时,其结果和上面的结果一模一样。
  1. public Map<String, Object> serialize() {
  2.   return null;
  3.     }
复制代码

是的,总结:当需要序列化的类是Map的子类时,会直接取Map的键值对数据!
也就是说,当你的类继承于map时,接口ConfigurationSerializable的实现方法不会有任何效果,你只能在外面put一个“==”进行绑定class。
但是,你仍然需要实现这个接口,因为你需要反序列化。


这个坑跳了两三个小时,苦恼。希望大家不要踩了= =

第一页 上一页 下一页 最后一页