【问题标题】:Serializing a tree structure using JAXB in Java在 Java 中使用 JAXB 序列化树结构
【发布时间】:2012-10-22 21:30:51
【问题描述】:

所以我有一个树实现了我的自定义树结构,而不是像这样:

树类:

@XmlRootElement
public class Tree {

   Set<? extends TreeNode> nodes;
   @XmlElement
   Set<? extends TreeNode> getNodes() {...}
}

抽象节点:

public abstract class Node {
   Set<? extends Node> children;
   private String name;

   @XmlAttribute
   public String getName() {...}
   @XmlElement
   public abstract Set<? extends Node> getChildren();

}

组(可以包含组和实体):

@XmlRootElement(name = "group")
public class Group extends Node {

    private final Set<Group> groups = new HashSet<Group>();
    private final Set<Entity> entities = new HashSet<Entity>();
    public Set<Group> getGeoups() { ... }
    public Set<Entity> getEntities() { ... }
} 

节点:

@XmlRootElement(name = "entity")
public class Entity extends Node {

    public Set<DashboardNode> getChildren() {
        return Collections.<DashboardNode> emptySet();
    }
}

我的问题是,JAXB 不对组和实体使用不同的名称。我想得到类似的结果:

<tree>
   <node>
       <group>
            <group>
                <entity/>
            </group>
       </group>
   </node>
   <node>
       <group>
           <entity/>
       </group>
       <group>
       </group>
       <entity/>
   </node>
</tree>

我得到了这个:

<tree>
   <node>
       <children>
            <children>
                <children/>
            </children>
       </children>
   </node>
   (...)
</tree>

如果我在 getChildren() 方法上删除抽象节点类中的注释,我只会收到这个:

<tree>
   <node>
   </node>
  <node>
   </node>
</tree>

【问题讨论】:

    标签: java xml serialization tree jaxb


    【解决方案1】:

    查看@XmlElements 注释,将其中一个合适的添加到Node 的children 属性应该可以实现您所追求的。

    【讨论】:

    • 我所做的是在我的 Node 类中向Set&lt;? extends TreeNode&gt; getNodes() 添加注释:@XmlElements( {@XmlElement(name = "group", type = Group.class), @XmlElement(name = "entity", type =Entity.class)}) 这几乎是完美的,除了事实是,所有“组中的实体都加倍了。为了防止这种情况,我不得不在我的 Group 类中将 @XmlTransient 注释添加到 getEntities() (因为我想,实体已经由我的抽象 Node 类中的 getChildren() 方法处理。感谢您的帮助!
    • @dstronczak 实际上,进一步考虑更好的方法是使用@XmlElementRefits JavaDoc page 上的“示例 1”几乎就是您的情况。
    【解决方案2】:

    问题在于您的组“是一个”节点。序列化程序遇到既有“孩子”又有“组”的对象时该怎么办?

    完全避免java继承可能会更好。

    实际上,getGeoups() [原文如此] 或 getEntities() 上都没有 @XMLElement 注释...

    【讨论】:

      猜你喜欢
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多