【发布时间】:2015-09-09 21:21:51
【问题描述】:
我正在编写一个软件来管理盒子事件。核心类是BoxEvent、Fight 和Fighter。一个盒子事件有一个所有可用战士的列表以及包含对特定战士的引用的战斗。
对于引用,每个Fighter 都有一个唯一的 ID,用作@XmlID,并在通过@XmlIDREF 的战斗列表中引用。 JAXB(un)编组工作正常。 XML 文件与此类似:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<boxEvent>
<fighter uuid="id_efc8c3f6-f95c-424f-a6d4-f9fde1cdd3a1">
<birthday>1995-08-31</birthday>
<firstName>Donald</firstName>
<lastName>Duck</lastName>
<gender>MALE</gender>
<weight>62.0</weight>
</fighter>
<fighter uuid="id_356f82d1-14a7-4cce-bf5b-18d6e59eddfe">
<birthday>1994-08-25</birthday>
<firstName>Mickey</firstName>
<lastName>Mouse</lastName>
<gender>MALE</gender>
<weight>56.9</weight>
</fighter>
<fighter uuid="id_c4b8d4c9-de24-4bfb-bad8-36a5bd4433b5">
<birthday>1991-08-12</birthday>
<firstName>Minnie</firstName>
<lastName>Mouse</lastName>
<gender>FEMALE</gender>
<weight>40.8</weight>
</fighter>
<fights>
<fighterInBlueCorner>id_356f82d1-14a7-4cce-bf5b-18d6e59eddfe</fighterInBlueCorner>
<fighterInRedCorner>id_efc8c3f6-f95c-424f-a6d4-f9fde1cdd3a1</fighterInRedCorner>
</fights>
</boxEvent>
现在的问题是,一场战斗可能还没有两个战士,而只有一个。这是通过使用特殊的 Fighter 对象(null object)和 not null 在内部实现的,并且此特殊对象 not 在所有拳击手列表中(因为它不是真正的拳击手,而是一个实现细节)。这意味着:一个失踪的战士可以在战斗中被编组(因为它有一个 ID,因为从技术上讲它是一个Fighter),但它不能被解组,因为这个 ID 不会在所有战士的列表中找到。
虽然我已经找到了存储null(例如this question)的解决方案,但我找不到适合“空对象”的解决方案。
所以我的问题是:是否可以使用@XmlJavaTypeAdapter 或任何其他技术将空对象替换为null 进行编组?而在解组时则相反:为一个角落里失踪的战士创建这个特殊的空对象?
我也很高兴听到有关如何处理该问题的其他想法,或者您能否为我指明正确的方向。谢谢!
【问题讨论】: