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>

クラス名に衝突がないことはわかっています。使用できるオプションの1つは、単純な検索と置換スクリプトですが、上記のようにエクスポートする方法で「単純」に構成するオプションがあるかもしれません。

完全修飾クラス名がないと、作成するオブジェクトを単純に認識できないため、前述のスクリプトなどを実行せずに、上記の形式のものを DESERIALIZE する方法がないことを認識しています..

助けや回避策のアイデアをありがとう、クリス

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 に答える