Oddiy konvertordan maydon izohlariga qanday kirish mumkin?

Java-da XML ma'lumotlarini marshall/unmarshall qilish uchun oddiy (http://simple.sourceforge.net/) kutubxonasidan foydalanmoqdaman. Ba'zi murakkabroq ma'lumotlar tuzilmalari uchun men o'z Konvertorlarimni yozishim kerak. Masalan, menda marshall qilishim kerak bo'lgan List<List<String>> bor deb ayting. Men quyidagilarni yozdim:

class WorldObject {

   @Element(name="vector-names")
   @Convert(ListListConverter.class)
   private List<List<String>> vectorNames;

   /** Constructor and other details ... **/

}

ListListConverter bilan bir qatorda (men unmarshallerni hozircha qoldirdim):

class ListListConverter implements Converter<List<List<String>>> {

   @Override
   public List<List<String>> read(InputNode node) throws Exception {
      // stub
      return null;
   }   

   @Override
   public void write(OutputNode node, List<List<String>> value)
         throws Exception {

      node.setName("list-list-string");

      for (List<String> list : value) {
         OutputNode subList = node.getChild("list-string");

         for (String str : list) {
            OutputNode stringNode = subList.getChild("string");
            stringNode.setValue(str);
         }

         subList.commit();
      }

      node.commit();

   }

}

Ushbu sozlash yaxshi ishlaydi va men xohlagan XMLni ishlab chiqaradi. Men teglarga standart nom ("list-list-string") o'rniga belgilangan nomni (bu holda "vector-names") berishim uchun @Element izohining name maydoniga kirishni xohlayman. Simple ishlatadigan barcha turlar uchun marshalling shunday ishlaydi, shuning uchun maxsus konvertordan ushbu ma'lumotlarga kirishning yo'li bo'lishi kerak.

Buni qanday amalga oshirishim mumkin?


person derefed    schedule 18.02.2012    source manba
comment
Izohni olish uchun kalit faqat bitta maydon uchun emas, balki ketma-ketlashtirmoqchi bo'lgan butun ob'ekt uchun konvertor yozishdir.   -  person ollo    schedule 12.02.2013
comment
Btw. Ushbu ajoyib / foydali / qiziqarli savol uchun +1!   -  person ollo    schedule 12.02.2013


Javoblar (1)


Izohni shu tarzda olmaysiz, chunki unga maydon-konvertoridagi maydon orqali kirish mumkin emas.
yechim WorldObject-Konverterni yozish uchun - hatto bitta maydonni yozishni xohlasangiz ham.

WorldObject sinf:

@Root
@Convert(WorldObjectConverter.class) // specify converter for this class
public class WorldObject
{
    @Element(name = "vector-names")
    private List<List<String>> vectorNames;

    // only for the example below - write whatever constructor(s) you need
    public WorldObject()
    {
        this.vectorNames = new ArrayList<>();
    }

    // constructor, getter / setter, etc.


    // a getter is required to access the field in the converter.
    public List<List<String>> getVectorNames()
    {
        return vectorNames;
    }
}

WorldObjectConverter sinf:

public class WorldObjectConverter implements Converter<WorldObject>
{
    @Override
    public WorldObject read(InputNode node) throws Exception
    {
        throw new UnsupportedOperationException("Not supported yet.");
    }


    @Override
    public void write(OutputNode node, WorldObject value) throws Exception
    {
        final Field f = value.getClass().getDeclaredField("vectorNames"); // get the field 'vectorNames' of the 'WorldObject' class
        final Element elementAnnotation = f.getAnnotation(Element.class); // get the 'Element' annotation of the Field

        final String name = elementAnnotation.name(); // get the 'name'-value of the annotation
        node.setName(name); // set Nodename


        for( List<String> list : value.getVectorNames() )
        {
            OutputNode subList = node.getChild("list-string");

            for( String str : list )
            {
                OutputNode stringNode = subList.getChild("string");
                stringNode.setValue(str);
            }

            subList.commit();
        }

        node.commit();
    }
}

Misol:

final File f = new File("test.xml"); // output file

WorldObject wo = new WorldObject(); // the object to serialize

// some testdata ...
List<String> l = new ArrayList<>();
l.add("a");
l.add("b");
wo.getVectorNames().add(l);

l = new ArrayList<>();
l.add("c");
l.add("d");
wo.getVectorNames().add(l);


// create the serializer - dont forget the AnnotationStrategy!
Serializer ser = new Persister(new AnnotationStrategy());
ser.write(wo, f); // serialize it to file

Chiqish:

<vector-names>
   <list-string>
      <string>a</string>
      <string>b</string>
   </list-string>
   <list-string>
      <string>c</string>
      <string>d</string>
   </list-string>
</vector-names>

Bajarildi!

person ollo    schedule 11.02.2013