我遇到了有关可读性和跨平台问题的问题。
我们正在使用某些类和子类动态生成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之前提到过的脚本,因为没有完全限定的类名,简单无法知道要创建哪个对象。
感谢您提供任何帮助或解决方法, 克里斯
答案 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());
}
}
}