0

我面临关于可读性和跨平台问题的问题。

我们正在使用某些类和子类即时生成我们的 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>

我知道类名不会发生冲突,我可以使用的一个选项是简单的搜索和替换脚本,但也许有一个选项可以配置“简单”以导出如上所示的内容。

我知道如果不运行之前提到的脚本,就无法以上述格式对内容进行反序列化,因为没有完全限定的类名,简单无法知道要创建哪个对象..

感谢任何帮助或解决方法的想法,克里斯

4

1 回答 1

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());
        }

    }


}
于 2012-04-15T15:30:28.873 回答