JGraphx自定义顶点XML加载后值为null问题求助
解决JGraphX自定义顶点加载XML时值为null的问题
我之前在做JGraphX自定义顶点序列化的时候也踩过这个坑,加载XML时顶点值返回null,大多是编解码器注册或者对象序列化的细节没处理到位,给你几个排查和解决的方向:
1. 确保自定义对象有无参构造函数
mxObjectCodec在反序列化实例化对象时,必须调用无参构造函数。如果你的Myobject类只写了带参数的构造,那肯定会实例化失败,最终返回null。一定要加上无参构造:
public class Myobject { // 必须保留无参构造,哪怕是空实现 public Myobject() {} // 你的业务属性和get/set方法 private String label; private int id; public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } public int getId() { return id; } public void setId(int id) { this.id = id; } }
2. 优化mxObjectCodec的注册方式
你当前的注册写法new mxObjectCodec(new Myobject())本身没问题,但如果自定义对象有私有属性,编解码器可能无法自动识别。可以显式指定要序列化的属性,确保读写正常:
// 显式声明需要序列化的属性列表,避免私有属性无法被映射 mxObjectCodec myObjCodec = new mxObjectCodec( new Myobject(), new String[]{"label", "id"}, // 要序列化的属性名 null, null ); mxCodecRegistry.register(myObjCodec); // 同时确保包路径注册正确,要和Myobject的全类名包一致 mxCodecRegistry.addPackage("com.your.project.package");
3. 检查保存后的XML格式是否正确
保存后的XML里,自定义对象的节点必须包含正确的class属性,指向你的Myobject全类名,比如:
<mxCell id="1" value="<mxObject class='com.your.project.package.Myobject' label='测试顶点' id='1001'/>" style="..." parent="0"/>
如果XML里的class路径和实际类的包路径不匹配,加载时就无法找到对应的类,自然返回null。
4. 手动处理反序列化回调(兜底方案)
如果自动映射还是失效,可以给编解码器添加afterDecode回调,手动从XML节点读取属性赋值:
mxObjectCodec myObjCodec = new mxObjectCodec(new Myobject()) { @Override public Object afterDecode(mxCodec dec, Object node, Object obj) { Myobject target = (Myobject) obj; // 从XML元素中手动提取属性并赋值 Element elem = (Element) node; target.setLabel(mxUtils.getAttribute(elem, "label")); target.setId(Integer.parseInt(mxUtils.getAttribute(elem, "id"))); return super.afterDecode(dec, node, obj); } }; mxCodecRegistry.register(myObjCodec);
5. 加载时的正确姿势
加载XML的时候,确保用mxCodec正确解码,并且获取顶点值时强制转换为你的自定义对象:
// 假设xmlDoc是你加载的XML文档 mxCodec codec = new mxCodec(); codec.decode(xmlDoc.getDocumentElement(), graph.getModel()); // 获取顶点并转换值 mxCell vertexCell = (mxCell) graph.getModel().getCell("1"); Myobject myObj = (Myobject) vertexCell.getValue(); // 现在myObj应该不为null了
内容的提问来源于stack exchange,提问作者Matin Meskin
相关产品推荐
相关产品推荐

