У меня есть приложение в стиле словаря, над которым я работаю с Java, и я использую Simple Framework для сериализации. Он включает в себя ArrayList of Strings, и единственная проблема, с которой я столкнулся, заключается в том, что Simple будет сериализовывать / десериализовывать эти строки и изменять любые пустые значения на null. Из этого вопроса я понимаю, что вам нужно использовать конвертер. Я следовал тому, что было описано на этой странице, и добавил класс, который Санд написал в своем ответе (с необходимым изменением «new AnnotationStrategy ()»), и теперь вот как выглядит основной класс, с которым у меня возникают проблемы (с многочисленные методы get / set удалены):
public class Item {
@ElementList(name = "itemContents")
@Convert(SimpleXMLStringConverter.class)
private ArrayList<String> values;
public Item()
{
}
}
Всякий раз, когда я пытаюсь записать класс в файл XML, я получаю эту ошибку:
org.simpleframework.xml.convert.ConvertException: Element annotation required for field 'values' private java.util.ArrayList main.LangComp.Item.values
at org.simpleframework.xml.convert.ConverterScanner.getConvert(ConverterScanner.java:147)
at org.simpleframework.xml.convert.ConverterScanner.getConvert(ConverterScanner.java:121)
at org.simpleframework.xml.convert.ConverterScanner.getConverter(ConverterScanner.java:100)
at org.simpleframework.xml.convert.AnnotationStrategy.write(AnnotationStrategy.java:175)
at org.simpleframework.xml.convert.AnnotationStrategy.write(AnnotationStrategy.java:155)
at org.simpleframework.xml.core.Source.setOverride(Source.java:394)
at org.simpleframework.xml.core.Factory.setOverride(Factory.java:170)
at org.simpleframework.xml.core.Composite.isOverridden(Composite.java:1387)
at org.simpleframework.xml.core.Composite.writeElement(Composite.java:1309)
at org.simpleframework.xml.core.Composite.writeUnion(Composite.java:1194)
at org.simpleframework.xml.core.Composite.writeElements(Composite.java:1165)
at org.simpleframework.xml.core.Composite.writeSection(Composite.java:1071)
at org.simpleframework.xml.core.Composite.write(Composite.java:1042)
at org.simpleframework.xml.core.Composite.write(Composite.java:1019)
at org.simpleframework.xml.core.Traverser.write(Traverser.java:236)
at org.simpleframework.xml.core.CompositeList.write(CompositeList.java:248)
at org.simpleframework.xml.core.Composite.writeElement(Composite.java:1331)
at org.simpleframework.xml.core.Composite.writeElement(Composite.java:1314)
at org.simpleframework.xml.core.Composite.writeUnion(Composite.java:1194)
at org.simpleframework.xml.core.Composite.writeElements(Composite.java:1165)
at org.simpleframework.xml.core.Composite.writeSection(Composite.java:1071)
at org.simpleframework.xml.core.Composite.write(Composite.java:1042)
at org.simpleframework.xml.core.Composite.write(Composite.java:1019)
at org.simpleframework.xml.core.Traverser.write(Traverser.java:236)
at org.simpleframework.xml.core.Traverser.write(Traverser.java:208)
at org.simpleframework.xml.core.Traverser.write(Traverser.java:186)
at org.simpleframework.xml.core.Persister.write(Persister.java:1187)
at org.simpleframework.xml.core.Persister.write(Persister.java:1169)
at org.simpleframework.xml.core.Persister.write(Persister.java:1147)
at org.simpleframework.xml.core.Persister.write(Persister.java:1266)
at org.simpleframework.xml.core.Persister.write(Persister.java:1248)
at org.simpleframework.xml.core.Persister.write(Persister.java:1229)
at org.simpleframework.xml.core.Persister.write(Persister.java:1208)
at main.IO.FileHandler.WriteXML(FileHandler.java:32)
at main.UI.MainUI.formWindowClosing(MainUI.java:108)
at main.UI.MainUI.access$000(MainUI.java:16)
at main.UI.MainUI$1.windowClosing(MainUI.java:76)
at java.awt.Window.processWindowEvent(Window.java:2045)
at javax.swing.JFrame.processWindowEvent(JFrame.java:296)
at java.awt.Window.processEvent(Window.java:2003)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Window.dispatchEventImpl(Window.java:2713)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:680)
at java.awt.EventQueue$4.run(EventQueue.java:678)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Мне удалось заставить эту программу работать раньше, единственная проблема состояла в том, что она превратила бы пустые строки в ноль, чего мне следует избегать. Я не могу понять, что является причиной проблемы или как ее исправить. Это потому, что класс конвертера, который я получил из вопроса, который я связал, предназначен для строк, а не для ArrayLists, или это не имеет значения, потому что узлы XML являются строками, а не списками? У меня возникают проблемы с пониманием того, какую аннотацию он хочет получить, когда в ней написано «Аннотация элемента, необходимая для поля».