Simple(Java Lib)生成的XML格式

时间:2012-04-15 15:16:03

标签: java xml serialization

我遇到了有关可读性和跨平台问题的问题。

我们正在使用某些类和子类动态生成UI。举个例子,我将使用基本元素(不是UI元素),但我认为“问题”应该是显而易见的。

我问如果在Simple(http://simple.sourceforge.net/home.php)中有任何配置开关来实现所需的结果。如上所述,它关于另一个平台的可读性,如果我只需要针对JAVA,我就不会关心XML的外观和感觉。

所以,在我的例子中,我序列化了一个简单的类,结果是:

<GuiElementExamples>
   <LastCreated>2012-04-15 16:48:59.813 CEST</LastCreated>
   <NonGuiObject>
      <objectBase class="objects.single.simple.StringObject" _value="">
         <_readonly>false</_readonly>
      </objectBase>
      <objectBase class="objects.single.simple.StringProperty">
         <_items>
            <object class="objects.single.simple.StringObject" _value="Label">
               <_readonly>true</_readonly>
            </object>
            <object class="objects.single.simple.StringObject" _value="">
               <_readonly>false</_readonly>
            </object>
         </_items>
         <_readonly>false</_readonly>
      </objectBase>
   </NonGuiObject>
</GuiElementExamples>

我希望拥有(我将手工制作它作为一个例子),是这样的:

<GuiElementExamples>
   <LastCreated>2012-04-15 16:48:59.813 CEST</LastCreated>
   <NonGuiObject>
      <StringObject _value="">
         <_readonly>false</_readonly>
      </StringObject>
      <StringProperty>
         <_items>
            <StringObject _value="Label">
               <_readonly>true</_readonly>
            </StringObject>
            <StringObject _value="">
               <_readonly>false</_readonly>
            </StringObject>
         </_items>
         <_readonly>false</_readonly>
      </StringProperty>
   </NonGuiObject>
</GuiElementExamples>

我知道类名中没有冲突,我可以使用的一个选项是一个简单的搜索和替换脚本,但也许有一个选项来配置“简单”以导出东西,如上所示。

我知道无法以上述格式对所有内容进行DESERIALIZE之前提到过的脚本,因为没有完全限定的类名,简单无法知道要创建哪个对象。

感谢您提供任何帮助或解决方法, 克里斯

1 个答案:

答案 0 :(得分:0)

像往常一样,写完之后,回到文档,我发现它:-)
这是教程页面上的最后一个条目,在我的例子中,这就是诀窍:
编辑这不适用于多个元素,不要问我为什么编辑

  @ElementListUnion({@ElementList(entry = "StringObject", type = StringObject.class)})
  private ArrayList<T> _items = new ArrayList<T>();

我使用的解决方案有点复杂,但完成工作。我将在这里发布源代码以指向正确的方向(ObjectBase是我想要“重命名”上述方式的所有对象的基类):

public class FormatVisitor implements Visitor
{
    private static ILogger _logger = LogManager.GetLogger(FormatVisitor.class);
    @Override
    public void read(Type type, NodeMap<InputNode> strings) throws Exception
    {

    }

    public void write(Type type, NodeMap<OutputNode> node)
    {
        OutputNode element = node.getNode();


        Class javaType = type.getType();

        if (ObjectBase.class.isAssignableFrom(javaType))
        {
            _logger.Verbose("Old name was " + element.getName());
            element.setName(javaType.getSimpleName());
            _logger.Verbose("Changing name to " + javaType.getSimpleName());
        }

        try
        {
            String className =  element.getAttributes().get("class").getValue();
            Class localClass = Class.forName(className);
            boolean shouldShortenName = ObjectBase.class.isAssignableFrom(localClass);
            if (shouldShortenName)
            {
                element.getAttributes().remove("class");
                element.setName(localClass.getSimpleName());
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();  
        }


        if (ObjectBase.class.isAssignableFrom(javaType))
        {
            element.setName(type.getType().getSimpleName());
        }

    }


}