Правильное использование org.simpleframework.xml.ElementMap? - PullRequest
4 голосов
/ 30 января 2012

Я пытаюсь использовать org.simpleframework.xml.ElementMap для сопоставления следующего XML с моими классами Java:

<my_map class="java.util.HashMap">

    <my_entry id="one" other_attribute="abc">
            <my_entry_element>blahblah one</my_entry_element>
    </my_entry>

    <my_entry id="two" other_attribute="def">
        <my_entry_element>blahblah two</my_entry_element>
    </my_entry>

</my_map>

Однако я могне найти никакого решения.Чем ближе я могу стать, так это заключить каждую запись в избыточный <entry id="xyz"> ... </entry>, например, так:

<my_map class="java.util.HashMap">

    <entry id="one">
        <my_entry id="one" other_attribute="abc">
            <my_entry_element>blahblah one</my_entry_element>
        </my_entry>
    </entry>

    <entry id="two">
        <my_entry id="two" other_attribute="def">
            <my_entry_element>blahblah two</my_entry_element>
        </my_entry>
    </entry>

</my_map>

Приведенный выше фрагмент XML хорошо работает со следующимиОболочка Java:

@Root(name="my_root_class")
public class MyRootClass {

    @ElementMap(name="my_map"
            ,key="id"
            ,keyType=String.class
            ,valueType=MyEntry.class
            ,attribute=true
            ,inline=false
            )
    private Map<String, MyEntry> myEntries = new HashMap<String, MyEntry>();

    // ... (getters/setters/..)

}

Элементы отображаются правильно:

MyRootClass [
    two: MyEntry [id=two, otherAttribute=def, myEntryElement=blahblah two]
    one: MyEntry [id=one, otherAttribute=abc, myEntryElement=blahblah one]
]

Затем я пытаюсь установить "inline = true" и удалить избыточный <entry>.Если я установлю inline = "true" , entry = "my_entry" и использую первый XML, который я ввел в начале этого сообщения (реальный, тот, который яхотел бы использовать), я получаю сообщение об ошибке:

ExceptionUnable to satisfy @org.simpleframework.xml.ElementMap(keyType=class java.lang.String, inline=true, entry=my_entry, name=my_map, data=false, empty=true, value=, attribute=true, valueType=class com.mycomp.thomas.simpleXml.MyEntry, required=true, key=id) on field 'myEntries' private java.util.Map com.mycomp.thomas.simpleXml.MyRootClass.myEntries for class com.mycomp.thomas.simpleXml.MyRootClass at line 1

Я также пытался поиграть с value = "my_entry" или даже переименовать <my_entry> в файле XML в<entry> (по умолчанию), ничего не работает.

Может кто-нибудь подсказать мне параметры прав для использования в @ElementMap, чтобы заставить XML, представленный в самом начале этого поста, работать?

1 Ответ

3 голосов
/ 25 марта 2013

Я тоже сталкивался с этой проблемой.

К сожалению, желаемая компактная сериализация кажется невозможной в текущей версии Simple Framework (2.7).

Обратите внимание, что существует еще несколько лет исправление, позволяющее сериализовать примитивные значения в качестве атрибутов входа: https://sourceforge.net/tracker/index.php?func=detail&aid=3032849&group_id=112203&atid=661528

...